2013-01-09 14 views
6

Rozważmy następującej sytuacji:Odczekaj wielu wątków (POSIX C++)

mam foo obiektów, który jest wykorzystywany przez wiele nitek, które mogą lub nie mogą ponownie przywołać bar metody() na foo.

Jest idealnie (i pożądane), że bar() jest wykonywany wiele razy równolegle, ponieważ nigdy nie zmienia stanu foo.

Problem powstaje, gdy muszę zmienić stan foo z zewnątrz (z innego wątku, a nie z jednego z wątków "worker") - jak mogę zablokować foo w taki sposób, aby wywołujący wątek blokował do ostatni wątek roboczy jest wykonywany za pomocą paska(), a wszystkie wątki robocze będą blokowane przy pasku() aż do zwolnienia foo ponownie?

Oczywiście nie mogę po prostu użyć muteksu, który pozostaje zablokowany podczas wykonywania bar(), ponieważ wtedy nie będę miał tam współbieżności.

Wszelkie pomysły? Czy istnieje lepszy projekt dla tego typu problemów?

+3

Zobacz [Blokada czytnika-pisarza] (http://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) – hmjd

+0

dlaczego nie wprowadzić muteksa w wątkach roboczych wokół wywołania funkcji paska i także na wątku wywołującym, który chce zmienić stan foos. wątek wywołujący blokuje muteks i może bezpiecznie zmienić stan foo. – mgr

+2

'pthread_rwlock_t' może Cię zainteresować. – WhozCraig

Odpowiedz

4

nie jestem pewien, jak masz zamiar osiągnąć, że żaden z pracowników korzystania foo pozwolić pisarz go aktualizować, ale jeśli to nie ma obawy, następnie wystarczy użyć read/write mutex (pracowników do uzyskać blokadę odczytu, pisarz, aby uzyskać blokadę zapisu).

Warto jednak wspomnieć, że warto rozważyć wykonanie "kopii na piśmie". W ten sposób obciążenie synchronizacji będzie bliskie zeru. Aby to osiągnąć, możesz użyć shared_ptr atomically.

+0

Dzięki wszystkim wskazówkom do pthread_rwlock_t! – Pontomedon