🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #308509

Re: Kolejka, wątki dla Linuxa i C++

#308509
From: M.M.
Date: Tue, 03 May 2016 08:11
74 lines
5022 bytes
On Monday, May 2, 2016 at 2:49:05 PM UTC+2, Matt D. wrote:
> On 5/1/2016 10:35 AM, Borneq wrote:
> > Czy kolejka std::queue jest bezpieczna wątkowo?
> 
> Nie zabezpieczona -- nie do zapisu:
> http://stackoverflow.com/questions/21302142/is-stdqueue-thread-safe-with-producer-and-multiple-consumers
> http://stackoverflow.com/questions/1164023/is-there-a-production-ready-lock-free-queue-or-hash-implementation-in-c
> 
> W starszych zrodlach mozesz znalezc porady, aby problem "rozwiazac" 
> zabezpieczajac dany kontener, n.p., mutexem.
> Dzisiaj jednak nie radze siegac do zabezpieczania calych kontenerow 
> mutexami -- to zabije wydajnosc i skalowalnosc (przy wzrastajacej ilosci 
> cores wydajnosc moze zaczac spadac, zamiast rosnac). Moze byc lepiej 
> uzyc lock-free -- patrz nizej.

To wszystko racja, jednak nie przesadzajmy też w drugą ze stron. Ja
używam wielokrotnie kolejek w programach, jakbym wykonywał na nich
100 razy więcej operacji niż wykonuję, to program by nie zwolnił.
Wniosek z tego taki, że najprostsze rozwiązanie, czyli właśnie 
zabezpieczenie mutexem, będzie najlepsze. Implementacja struktur
lock-less, wait-less jest bardzo trudna i jeśli można, to trzeba
używać starych dobrych rozwiązań. Cytat z materiałów które załączyłeś:

[
Fortunately, you can force certain ordering guarantees all the way down to the CPU level using memory barriers. Unfortunately, they are extremely tricky to use properly. In fact, a major problem with lock-free code is that it's prone to bugs that can only be reproduced by specific non-deterministic interleavings of thread operations. This means a lock-free algorithm with a bug may work 95% of the time and only fail the other 5%. Or it may work all of the time on a developer's CPU, but fail occasionally on another CPU.
]


> 
> // Inny przyklad jak, IMHO, tego lepiej nie robic -- 
> https://software.intel.com/en-us/articles/single-producer-single-consumer-queue 
> -- `volatile` to tutaj za malo / nie daje zadnych gwarancji 
> wielowatkowych; memory barrier to tutaj za duzo -- czesto wystarczy para 
> jednostronnych transakcji atomicznych (acquire-release).
Bym powiedział dosadniej, volatile to nie tylko za mało, ale to wręcz nic, a
w dodatku różne kompilatory różnie się z tym obchodziły i być może nadal
różnie obchodzą.


> 
> > Jak napisać pod Linuxem dwie klasy, z których jedna w wątku (lub
> > głównym) będzie zapisywała do kolejki a druga w wątku odczytywała?
> 
> Jesli chcesz jeden producent i jeden konsument, to szukasz 
> single-producer, single-consumer (SPSC) lock-free queue (ringbuffer).
> 
> Jesli wiecej niz jeden, to multi-, n.p., MPMC -- ale nie uzywaj jesli 
> nie potrzebujesz, dla prostszego wariantu SPSC mozna zagwarantowac 
> wait-free, znacznie silniejsza gwarancja od lock-free.
> Terminologia: 
> http://www.boost.org/doc/libs/master/doc/html/lockfree.html#lockfree.introduction___motivation.introduction__amp__terminology
> 
> Tutaj jest porzadny przyklad:
> https://github.com/cameron314/readerwriterqueue
> opis: http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++
> 
> Zobacz tez:
> http://kukuruku.co/hub/cpp/lock-free-data-structures-exploring-queues
> 
> Boost.Lockfree -- boost::lockfree::spsc_queue
> http://boost.org/libs/lockfree
> 
> CDS: Concurrent Data Structures library
> https://github.com/khizmax/libcds
> W szczegolnosci:
> http://libcds.sourceforge.net/doc/cds-api/namespacecds_1_1container.html
> 
> Ogolne wprowadzenie do programowania lock-free:
> http://preshing.com/20120612/an-introduction-to-lock-free-programming/
> 

W sumie trochę podziwiam autorów, za takie implementacje :)

Pozdrawiam 
Technical Details
Message-ID: <4b5d3f96-c6dd-4138-b64d-4f76b9cd32bb@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!goblin3!goblin.stu.neva.ru!news.ripco.com!news.glorb.com!i5no2266635ige.0!news-out.google.com!k10ni110igv.0!nntp.google.com!sq19no1827551igc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <ng4f5c$lcc$1@node2.news.atman.pl> <ng7ic1$1o1$1@portraits.wsisiz.edu.pl>

Show Full Headers
Complete Article Headers
X-Received: by 10.66.156.101 with SMTP id wd5mr594389pab.33.1462263070559;        Tue, 03 May 2016 01:11:10 -0700 (PDT)
X-Received: by 10.50.98.70 with SMTP id eg6mr417171igb.4.1462263070498; Tue, 03 May 2016 01:11:10 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!goblin3!goblin.stu.neva.ru!news.ripco.com!news.glorb.com!i5no2266635ige.0!news-out.google.com!k10ni110igv.0!nntp.google.com!sq19no1827551igc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Tue, 3 May 2016 01:11:09 -0700 (PDT)
In-Reply-To: <ng7ic1$1o1$1@portraits.wsisiz.edu.pl>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=178.37.232.66; posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
NNTP-Posting-Host: 178.37.232.66
References: <ng4f5c$lcc$1@node2.news.atman.pl> <ng7ic1$1o1$1@portraits.wsisiz.edu.pl>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <4b5d3f96-c6dd-4138-b64d-4f76b9cd32bb@googlegroups.com>
Subject: Re: Kolejka, wątki dla Linuxa i C++
From: "M.M." <mmarszik@gmail.com>
Injection-Date: Tue, 03 May 2016 08:11:10 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit