Из справочной страницы pthread_mutex_lock()
:
Если тип мьютекса - PTHREAD_MUTEX_NORMAL, обнаружение взаимоблокировки должно
не будет предоставлено. Попытка разблокировать мьютекс вызывает тупик. Если
поток пытается разблокировать мьютекс, который он не заблокировал, или мьютекс
который разблокирован, неопределенные результаты поведения.
Если тип мьютекса - PTHREAD_MUTEX_DEFAULT, попытка рекурсивного
блокировка мьютекса приводит к неопределенному поведению. Попытка разблокировать
мьютекс, если он не был заблокирован вызывающим потоком, приводит к неопределенности
поведение. Попытка разблокировать мьютекс, если он не заблокирован, приводит к
в неопределенном поведении.
Итог: вполне возможно вызвать взаимоблокировку только с одним потоком, если вы попытаетесь заблокировать мьютекс, который уже заблокирован.
Если вам интересно, в Linux PTHREAD_MUTEX_DEFAULT
обычно является синонимом PTHREAD_MUTEX_NORMAL
, который, в свою очередь, используется в инициализаторе мьютекса по умолчанию.