2009-07-09 11 views
8

Con un pthread_cond_t tenemos que asociar un mutex, señalización Cuando la condición que he visto comollamada pthread_cond_broadcast con mutex sostenido o no? código

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_cond_broadcast(&cond); 
pthread_mutex_unlock(&mutex); 

y

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_mutex_unlock(&mutex); 
pthread_cond_broadcast(&cond); 

¿Cuál es la forma correcta? (¿Importa?)

Respuesta

13

Depende de lo que estén haciendo los sumideros (y de cualquier otra fuente).

En su segundo ejemplo de código, es posible que entre el desbloqueo y la transmisión, aparezcan un montón de otros subprocesos y realicen una combinación de cosas que hace que la condición vuelva a ser falsa. Estarás transmitiendo inútilmente. Y no necesariamente tendrá el mismo conjunto de camareros que cuando cambió la condición, lo que puede afectar o no su diseño.

Un fregadero decente no debería preocuparse si se despierta y la condición es falsa, especialmente si está utilizando la transmisión. Siempre que cada cambio de condición a "verdadero" sea seguido por una emisión, estoy bastante seguro de que con receptores escritos apropiadamente, puede transmitir una variable de condición de cualquier manera con o sin el bloqueo.

Así que no creo que realmente importe, pero personalmente transmitiría con la cerradura mantenida, aunque solo sea para evitar tener que preocuparme por ello. La "señal y cambio atómico" podría simplificar el diagrama de estado en su pizarra en comparación con "cambiar ... algún tiempo después, señal".

Ambos son correctos (a diferencia de esperar sin el mutex, que no está permitido), pero no creo que sea demasiado difícil encontrar usos que pueden salir mal en el segundo caso, que no sería ir mal en el primero. Sin embargo, probablemente tendrían que involucrar a algunos camareros haciendo cosas un tanto inusuales.

La especificación dice en lugar críptico "si se requiere un comportamiento de programación predecible, entonces ese mutex estará bloqueado por el hilo que llama a pthread_cond_broadcast() o pthread_cond_signal()."

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html

+0

Tener la misma pregunta que he encontrado la respuesta. He seguido su enlace y creo que le mordió que su cita está relacionada con el bit anterior: "Si se bloquea más de un hilo en una variable de condición, la política de programación determinará el orden en que los hilos se desbloquean". – wilx

+0

@wilx: sí, mi preocupación es lo que permite el "comportamiento de programación impredecible". Por ejemplo, suponga que tiene un planificador que está documentado, o tiene una opción, que excluye y las variables de condición eligen el subproceso para activarlo en una base FIFO. ¿La oración "críptica" implica que no se espera que el comportamiento sea FIFO si un llamante de 'pthread_cond_signal' no mantiene el mutex? Creo que sí, pero no conozco la definición formal de "predecible", por eso es que me resulta críptico. Excepto en un sistema RT, siempre trato la programación como un poco impredecible, pero no quiero que se vuelva extraño. –

+0

No se conoce ningún caso en el que importe si se transmitió antes o después del desbloqueo. Con gran dificultad, uno puede construir código que se rompe si mueves una señal después de un desbloqueo. –