pthread_join блокирует мой код - PullRequest
0 голосов
/ 30 января 2012

Можете ли вы объяснить, почему следующее использование pthread_join не работает? Оно блокирует мой код.если я прокомментирую эти 3 строки, мой код сделает то, что ожидается, но, очевидно, я не знаю, завершены ли потоки (в моем коде нет проблем для этого, но в большей ситуации есть).*

1 Ответ

1 голос
/ 30 января 2012

Ваш код не защищен от вызова fork с заблокированным мьютексом.Поскольку поток, который заблокировал мьютекс, не существует в дочернем элементе, он не может разблокировать мьютекс ... никогда.Любой поток в дочернем элементе, который пытается получить мьютекс, блокируется, ожидая, когда несуществующий поток снимет блокировку.

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

Вам действительно нужно знать, что вы делаете, чтобы использовать fork вместе с pthreadsесли вы не собираетесь немедленно exec в ребенка.

...