Señalizando una variable de condición (pthreads)

Supongamos que alguna variable de condición “cond” está asociada con una variable mutex “mutex”. Si un subproceso está inactivo en cond después de llamar a pthread_cond_wait(&cond,&mutex) , y otro subproceso que tiene mutex bloqueado está terminado, ¿importa si ese subproceso llama pthread_cond_signal(&cond) antes o después de llamar a pthread_mutex_unlock(&mutex) ? ¿Incluso necesita desbloquear el mutex si llama a pthread_cond_signal(&cond) , ya que el hilo durmiente adquirirá el mutex de todos modos?

EDITAR: De acuerdo con https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview , “No desbloquear el mutex después de llamar a pthread_cond_signal () puede no permitir que se complete la rutina pthread_cond_wait () correspondiente (permanecerá bloqueada). ” Supongo que entonces, el deslocking, y tal vez sólo después, es necesario.

Siempre debe desbloquear el mutex después de llamar a pthread_cond_signal . Aquí hay algunas buenas preguntas / respuestas para leer:

Llamando a pthread_cond_signal sin bloquear el mutex

No me llegará en este momento, pero estoy bastante seguro de que hay una buena razón (en términos de condiciones de carrera) por la que no desea desbloquear el mutex antes de hacer una señal.

Si mantiene el mutex bloqueado, entonces el hilo que se está despertando no puede adquirir el mutex, por lo que se bloqueará en pthread_cond_wait esperando para volver a adquirir el mutex.

No es necesario mantener el mutex bloqueado para llamar a pthread_cond_signal . De hecho, si la lógica de su aplicación puede funcionar con una señal cuando el mutex no está bloqueado, entonces esa es una mejor manera de hacerlo: el sistema operativo puede progtwigr el subproceso en espera de inmediato, y no tiene que esperar la señalización Hilo para desbloquear el mutex antes de continuar.

Sin embargo, en este escenario se debe tener cuidado para asegurarse de que el despertar no se pierda, y no tiene un problema con el hilo “incorrecto” que se está despertando. Si usa un predicado directo, esto no debería ser un problema en la práctica.