Столкнулся с задачкой. В программе есть главный поток и определенное кол-во других потоков. Главный поток инициализирует всю работу, затем делает pthread_mutex_lock(&work_mutex). Далее делает повторно pthread_mutex_lock(&work_mutex) чтобы ожидать разблокировку. Если какому-либо потоку понадобится чтобы программа корректна завершилась, то он сделает pthread_mutex_unlock(&work_mutex), тем самым разблокирует работу главного потока, который корректно всё завершит. Переменная work_mutex - глобальная.
В доках написано, что такое нельзя делать т.к. по мнению системы происходит взаимная блокировка (функция вернет EDEADLK). Но так как на деле ни в одном из используемых дистрибутивов Linux данная ошибка не появлялась, то было решено использовать вышеописанный код. Но пришлось портировать программу на FreeBSD, а вот там как раз и словил данную ошибку (EDEADLK).
Как можно вообще всё это более менее корректно реализовать?