Article View: pl.comp.lang.c
Article #308509Re: Kolejka, wątki dla Linuxa i C++
From: M.M.
Date: Tue, 03 May 2016 08:11
Date: Tue, 03 May 2016 08:11
74 lines
5022 bytes
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-mailReferences:
<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