форк в многопоточной программе

Я слышал, что смешивание разветвлений и потоков в программе может быть очень проблематичным, часто приводя к загадочному поведению, особенно при работе с общими ресурсами, такими как блокировки, каналы, файловые дескрипторы. Но я никогда полностью не понимаю, что именно представляет опасность и когда это может произойти. Было бы здорово, если бы кто-то, обладающий опытом в этой области, мог бы объяснить немного более подробно, что такое подводные камни и что необходимо учитывать при программировании в такой среде.

Например, если я хочу написать сервер, который собирает данные из различных различных ресурсов, я решил, что один из них заключается в том, чтобы сервер порождал набор потоков, каждый из которых должен вызывать другую программу для выполнения реальной работы, открывать каналы чтобы получить данные от ребенка. Каждый из этих потоков отвечает за свою собственную работу, без обмена данными между ними в ч / б, и когда данные собираются, основной поток имеет очередь, и эти рабочие потоки просто помещают результат в очередь. Что может пойти не так с этим решением?

Пожалуйста, не сужайте свой ответ, просто "отвечая" мой пример сценария. Любые предложения, альтернативные решения или опыт, которые не связаны с примером, но полезны для обеспечения чистого дизайна, были бы великолепны! Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос