Ваш код не защищен от вызова fork
с заблокированным мьютексом.Поскольку поток, который заблокировал мьютекс, не существует в дочернем элементе, он не может разблокировать мьютекс ... никогда.Любой поток в дочернем элементе, который пытается получить мьютекс, блокируется, ожидая, когда несуществующий поток снимет блокировку.
Существует множество возможных исправлений, но простейшим, вероятно, является удержание мьютексазвонок на fork
.Для этого вы можете использовать обработчик atfork .Организовать обработчик для получения мьютекса до fork
и освобождения его после (как в родительском, так и в дочернем).
Вам действительно нужно знать, что вы делаете, чтобы использовать fork
вместе с pthreadsесли вы не собираетесь немедленно exec
в ребенка.