Почему Glib может обрабатывать процессы с помощью потоков? - PullRequest
0 голосов
/ 22 мая 2018

Следующие сообщения ужасны для пользователей pthread:

Однако документы Glib говорят, что этоcan fork / exec при включении pthread:

Почему / как Глиб может это сделать?

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете fork () из pthread, но это может быть сложно сделать правильные детали.Например, разветвленная память процесса будет содержать копии всех условных переменных и мьютексов в исходном процессе.Здесь есть связанный вопрос и некоторые рекомендации о том, как, например, аккуратно освободить все мьютексы, содержащиеся в разных потоках.

разветвляется в многопоточном процессе с большим количеством состояний, хранящихся в потоках

Обратите внимание, что общая идея состоит в том, чтобы fork () выполнить некоторую очистку, а затем выполнить exec ()..

Список асинхронно-безопасных функций, которые можно вызывать между fork и exec, см. на этой man-странице (signal-safety (7))

НоМой общий совет - сделать ваше многопоточное приложение проще - разветвление с большим количеством состояний для обработки в потоках varioius вызывает проблемы.Например, exec () по своему дизайну сохраняет дескрипторы открытых файлов, поэтому, если какой-либо поток имеет дескриптор открытого файла, процесс exec (): ed может излишне переносить этот дескриптор.Утечки ресурсов - это запах кода и, как правило, признак небрежного дизайна.Используйте RAII, если можете.

...