2011-11-14 24 views
7

Ecco una versione semplificata del mio problema.C++ sincronizzazione multithreading

Ci sono N fili esecuzione dopo 3 istruzioni in un ciclo infinito:

A -> B -> C -> A -> B -> C -> A -> B -> ....... 

voglio che tutti i thread eseguono istruzioni B contemporaneamente ovvero esecuzione di B da qualsiasi thread deve cominciare solo se tutti i fili hanno raggiunto B. Quindi, se c'è un thread che ha eseguito B -> C -> A, dovrebbe aspettare qui finché altri thread sono pronti per l'esecuzione B.

Se possibile, fammi sapere una soluzione portatile che funzionerà su entrambe le finestre & MAC.

+0

Solo ieri ** [Bartosz Milewski ha pubblicato il suo video su C++ 11 Concurrency Series: 9. Condition Variables] (http://bartoszmilewski.wordpress.com/2011/11/13/c11-concurrency-series-9 Circostanza-variabili /) **. L'ho trovato il più divertente della serie (non c'è bisogno di vedere prima gli altri, penso) – sehe

risposta

4

Si consiglia di controllare il Boost thread library, in particolare la sezione su condition variables.

+7

Anche se questo suona più come si desidera una [barriera] (http://www.boost.org/doc/libs/1_47_0/ doc/html/thread/synchronization.html # thread.synchronization.barriers) –

+0

@MikeSeymour: Perché non lo aggiungi come risposta? – jgauffin

+0

Grazie Mike, sì, sembra che la barriera sia ciò di cui ho bisogno. Fammi entrare nei suoi dettagli e tornare in caso di problemi. Grazie ancora! – arvin

0

Un array di semafori N-1 e un mutex? Tutti i thread acquisiscono il mutex, inc un contatore e, se inferiore a N, rilasciano il mutex e attendono l'array del semaforo su [counter]. Il thread Nth trova il contatore come N, segnala tutti i semafori, azzera il contatore a 0, esegue 'B' rilascia il mutex ed esce. Gli altri thread, quando vengono rilasciati, eseguono anche B, ma non riescono ad andare in loop ed entrare di nuovo fino a quando il thread Nth ha eseguito "B" e rilasciato il mutex.

Tutti i sistemi operativi multitasking hanno semafori/mutex. Puoi utilizzare un evento, se disponibile, anziché il semaforo.

+1

In realtà, un semaforo segnalato [n-1] potrebbe andare bene - nessuna matrice necessaria con un semaforo, a differenza degli eventi. –