Descripción de pthread_mutex_lock
Si el tipo de enclavamiento es PTHREAD_MUTEX_NORMAL, no se proporciona ninguna detección de interbloqueo. Intentar volver a bloquear un mutex puede provocar un punto muerto. Si un subproceso intenta desbloquear un mutex que no está bloqueado o desbloqueado por ese subproceso, se producirá un comportamiento indefinido.
Si el tipo de enclavamiento es PTHREAD_MUTEX_ERRORCHECK, se proporciona verificación de errores. Si un hilo intenta volver a bloquear un mutex que ya está bloqueado por ese hilo, se devolverá un error. Si un hilo intenta desbloquear un mutex que no está bloqueado o desbloqueado por el hilo, se devuelve un mensaje de error.
Si el enclavamiento es del tipo PTHREAD_MUTEX_RECURSIVE, el enclavamiento conserva el concepto de recuento de bloqueo. La primera vez que un subproceso adquiere con éxito un mutex, el recuento de bloqueos se establece en 1. Cada vez que un hilo vuelve a bloquear el mutex, el recuento de bloqueos se incrementa en 1; cada vez que un hilo desbloquea el mutex, el recuento de bloqueos se reduce en 1. Cuando el recuento de bloqueos llega a 0, el mutex queda disponible para otros subprocesos. Si un hilo intenta desbloquear un mutex que no está bloqueado o desbloqueado por el hilo, se devuelve un mensaje de error.
Si el tipo de exclusión mutua es PTHREAD_MUTEX_DEFAULT, intentar bloquear recursivamente una exclusión mutua dará como resultado un comportamiento indefinido. Intentar desbloquear un mutex que no está bloqueado por el subproceso que realiza la llamada producirá un comportamiento indefinido. Intentar desbloquear un mutex que aún no está bloqueado dará como resultado un comportamiento indefinido.