garfo no programa multi-threaded

Ouvi dizer que mixar forking e threading em um programa pode ser muito problemático, geralmente resultando em comportamento misterioso, especialmente ao lidar com recursos compartilhados, como bloqueios, pipes, descritores de arquivos. Mas eu nunca entendo completamente o que exatamente são os perigos e quando isso pode acontecer. Seria ótimo se alguém com experiência nesta área pudesse explicar um pouco mais detalhadamente quais são as armadilhas e o que precisa ser cuidado ao programar em tal ambiente.

Por exemplo, se eu quiser escrever um servidor que coleta dados de vários recursos diferentes, uma solução que pensei é ter o servidor gerando um conjunto de threads, cada popen para chamar outro programa para fazer o trabalho real, abrir canais para obter os dados de volta da criança. Cada uma dessas respostas de threads para seu próprio trabalho, sem interexchange de dados em b / w-los, e quando os dados são coletados, o thread principal tem uma fila e esses segmentos de trabalho apenas colocarão o resultado na fila. O que poderia dar errado com essa solução?

Por favor, não restrinja sua resposta apenas "respondendo" meu cenário de exemplo. Qualquer sugestão, solução alternativa ou experiência que não esteja relacionada ao exemplo, mas útil para fornecer um design limpo, seria ótima! Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion