2011-11-14 22 views
7

Aquí hay una versión simplificada de mi problema.C++ multithreading synchronization

hay N hilos de ejecución a raíz 3 instrucciones en un bucle infinito:

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

Quiero que todos los hilos se ejecutan instrucciones B simultáneamente es decir, ejecución de B por cualquier hilo debe comenzar sólo si todas las discusiones han alcanzado B. Por lo tanto, si hay un hilo que ha ejecutado B -> C -> A, debería esperar aquí hasta que otros hilos también estén listos para ejecutarse B.

Si es posible, comuníqueme una solución portátil que funcione en ambas ventanas & MAC.

+0

Ayer ** [Bartosz Milewski publicó su vidcast en C++ 11 Concurrency Series: 9. Variables de condición] (http://bartoszmilewski.wordpress.com/2011/11/13/c11-concurrency-series-9 -condition-variables /) **. Lo encontré el más entretenido de la serie (no es necesario que vean a los demás primero, creo) – sehe

Respuesta

4

Debe consultar Boost thread library, especialmente la sección sobre condition variables.

+7

Aunque esto suena más como si quisieras una [barrera] (http://www.boost.org/doc/libs/1_47_0/ doc/html/thread/synchronization.html # thread.synchronization.barriers) –

+0

@MikeSeymour: ¿Por qué no lo agrega como respuesta? – jgauffin

+0

Gracias Mike, sí parece que la barrera es lo que necesito. Déjame entrar en sus detalles y volver por si tengo problemas. ¡Gracias de nuevo! – arvin

0

¿Una matriz de semáforos N-1 y un mutex? Todos los subprocesos adquieren el mutex, inc un contador y, si es menor que N, liberan el mutex y esperan en el conjunto de semáforos en [contador]. El enésimo hilo encuentra que el contador es N, señala a todos los semáforos, restablece el contador a 0, ejecuta 'B' libera el mutex y sale. Los otros hilos, cuando se sueltan, también ejecutan B pero no pueden girar y volver a entrar hasta que la enésima secuencia haya ejecutado 'B' y liberado el mutex.

Todos los sistemas operativos multitarea tienen semáforos/mutex. Podría usar un evento, si está disponible, en lugar del semáforo.

+1

En realidad, un semáforo señalado [n-1] veces estaría bien - no es necesaria una matriz con un semáforo, a diferencia de los eventos. –