2013-01-09 4 views
6

consideri la seguente situazione:Attendere più thread (thread Posix, C++)

Ho un foo oggetto che viene utilizzato da più fili, che può o non può chiamare ripetutamente una barra metodo() su foo.

È perfettamente possibile (e desiderato) che la barra() venga eseguita più volte in parallelo, poiché non modifica mai lo stato di foo.

Il problema sorge quando ho bisogno di cambiare lo stato di foo dall'esterno (da un altro thread, non da uno dei thread "worker") - come posso bloccare foo in un modo tale che il thread chiamante blocchi fino a quando l'ultimo thread di lavoro viene eseguito con bar() e tutti i thread di lavoro verranno bloccati a bar() fino a quando non rilascii nuovamente foo?

Ovviamente non posso semplicemente usare un mutex che rimane bloccato durante l'esecuzione di bar(), perché in quel caso non avrò concomitanza.

Qualche idea? O c'è un design migliore per quei tipi di problemi?

+3

Vedere [Blocco Readers-writer] (http://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) – hmjd

+0

perché non introdurre un mutex nei thread worker attorno alla chiamata della funzione bar e su anche sul thread chiamante che vuole cambiare lo stato foos. il thread chiamante blocca il mutex e può tranquillamente cambiare lo stato di foo. – mgr

+2

'pthread_rwlock_t' potrebbe interessarti. – WhozCraig

risposta

4

io non sono sicuro di come si sta per raggiungere, che nessuna delle lavoratori utilizza foo lasciare scrittore aggiornarlo, ma se non è di una preoccupazione poi basta usare un read/write mutex (lavoratori a ottenere il blocco della lettura, writer per ottenere il blocco della scrittura).

Vale la pena ricordare, tuttavia, che si potrebbe voler prendere in considerazione la possibilità di fare Copy-on-Write. In questo modo si renderà l'overhead della sincronizzazione vicino allo zero. È possibile utilizzare shared_ptr atomically per raggiungere questo obiettivo.

+0

Grazie a tutti i suggerimenti su pthread_rwlock_t! – Pontomedon