Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pl.comp.os.linux.programowanie > #2075 > unrolled thread
| Started by | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| First post | 2016-05-01 10:35 +0200 |
| Last post | 2016-05-02 14:49 +0200 |
| Articles | 2 — 2 participants |
Back to article view | Back to pl.comp.os.linux.programowanie
Kolejka, wątki dla Linuxa i C++ Borneq <borneq@antyspam.hidden.pl> - 2016-05-01 10:35 +0200
Re: Kolejka, wątki dla Linuxa i C++ "Matt D." <no-spam@invalid.local> - 2016-05-02 14:49 +0200
| From | Borneq <borneq@antyspam.hidden.pl> |
|---|---|
| Date | 2016-05-01 10:35 +0200 |
| Subject | Kolejka, wątki dla Linuxa i C++ |
| Message-ID | <ng4f5c$lcc$1@node2.news.atman.pl> |
Czy kolejka std::queue jest bezpieczna wątkowo? 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?
[toc] | [next] | [standalone]
| From | "Matt D." <no-spam@invalid.local> |
|---|---|
| Date | 2016-05-02 14:49 +0200 |
| Message-ID | <ng7ic1$1o1$1@portraits.wsisiz.edu.pl> |
| In reply to | #2075 |
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. // 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). > 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/ Pozdrawiam, Matt
[toc] | [prev] | [standalone]
Back to top | Article view | pl.comp.os.linux.programowanie
csiph-web