Разветвление многопоточного процесса

У меня есть приложение с двумя потоками. Один поток разветвляется по событию, а другой поток делает что-то, что приводит к большому количеству вызовов getaddrinfo(). Я сталкиваюсь с проблемой, когда в некоторых случаях разветвленный дочерний элемент зависает на мьютексе внутри вызова getaddrinfo().

Теперь я понимаю, что это происходит только тогда, когда дочерний процесс разветвляется, а второй поток в родительском процессе находится в вызове getaddinfo(). Это приводит к тупиковой ситуации, поскольку дочерний процесс наследует родительскую блокировку, но никогда не освобождает ее.

Мой вопрос: как можно решить эту проблему, когда сам системный вызов блокируется? Что ж, один из способов исправить это — синхронизировать системный вызов fork и вызов getaddrinfo в обоих потоках. Но есть ли другой способ сделать это?

Спасибо!


person wabbit    schedule 01.03.2021    source источник


Ответы (1)


В итоге я использовал pthread_atfork для регистрации обработчиков pre/post-fork, которые блокировали/разблокировали соответственно. Думаю, это единственный выход в данном случае.

Я просто хочу, чтобы на справочных страницах этих вызовов (например, getaddrinfo) упоминалось, что они берут внутренние блокировки, чтобы программисты не попали в эту ловушку.

person wabbit    schedule 04.03.2021