Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.os.linux.programowanie > #2075 > unrolled thread

Kolejka, wątki dla Linuxa i C++

Started byBorneq <borneq@antyspam.hidden.pl>
First post2016-05-01 10:35 +0200
Last post2016-05-02 14:49 +0200
Articles 2 — 2 participants

Back to article view | Back to pl.comp.os.linux.programowanie


Contents

  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

#2075 — Kolejka, wątki dla Linuxa i C++

FromBorneq <borneq@antyspam.hidden.pl>
Date2016-05-01 10:35 +0200
SubjectKolejka, 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]


#2076

From"Matt D." <no-spam@invalid.local>
Date2016-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