¿Por qué es necesario bloquear un mutex antes de llamar a pthread_cond_wait?
Porque de lo contrario hay una condición de carrera inevitable.
Un mutex protege el estado compartido. Una variable de condición está asociada con algún predicado ("condición") en el estado. La idea básica es que desea:
1) Comprobar el predicado
2) si el predicado es falsa, ir a dormir hasta que se convierte en verdadera
En un sistema concurrente, que siempre es posible para algunos subprocesos para que el predicado sea verdadero entre (1) y (2). Para evitar esta carrera, debe mantener un mutex antes (1) y debe liberarlo atómicamente a medida que realiza (2).
Por ejemplo, para una cola, el predicado podría ser "la cola no está vacía". Pero entre el momento en que comprueba si la cola no está vacía y la hora en que se va a dormir, algún otro subproceso podría agregar algo a la cola.
Por lo tanto, debe mantener el mutex al tiempo que verifica el predicado y en el momento en que llama a pthread_cond_wait.
Además, ¿es necesario realizar un bloqueo (en el mismo mutex) antes de llamar a pthread_cond_signal?
Que yo sepa, no hay un problema fundamental con esto; solo introduce ineficiencias potenciales.
Aquí otra vez, cualquier estado compartido que esté modificando (y haciendo así que el predicado sea verdadero) tiene que estar protegido por un mutex. De modo que cada vez que desee para señalizar la condición, debe mantener el mutex de todos modos.
Si suelta el mutex antes de señalar la condición, es posible que el predicado se vuelva falso entre ellos debido a la acción de algún otro hilo. Esta raza no causa fallas porque cualquier hilo que espere la condición debe verificar el predicado de todos modos antes de continuar ... Pero ¿por qué ponerlo en problemas?
En pocas palabras: Simplemente siga las instrucciones y ni siquiera tiene que pensar en estas preguntas. :-)
Vea también: http://stackoverflow.com/questions/4544234/calling-pthread-cond-signal-without-locking-mutex – ninjalj