叉在多线程程序(fork in multi-threaded program)

2019-06-18 03:01发布

我听说,在一个程序中混合使用分叉和线程可能是非常有问题的,神秘的行为与共享资源,如锁,管道,文件描述符打交道时往往造成,尤其是。 但我从来没有完全理解正是风险所在,当这些可能发生。 这将是巨大的,如果有人在这方面的人才能够在细节缺陷是什么,哪些需要被呵护在这样的环境下编程时解释一点。

例如,如果我想编写从各种不同的资源收集数据的服务器,一个解决方案,我已经想到是让服务器派生一组线程,每个popen方法调用了另一个程序做实际工作中,开放管道获取数据从孩子回来。 每一个为自己工作这些线程响应,在B / W他们没有数据的互换,并在收集数据时,主线程有一个队列,这些工作线程将只是把结果在队列中。 什么能去错了这个解决方案?

请不要只是“回答”我的示例场景缩小你的答案。 不相关的例子,但有助于提供一个干净的设计有什么建议,替代解决方案,或经验将是巨大的! 谢谢!

Answer 1:

与派生,当你有一些线程运行的问题是,叉只复制一个线程调用它的CPU状态。 这是因为如果所有其他线程刚刚去世,瞬间,无论他们在哪里。

这样做的结果是锁不被释放,和共享数据(如malloc的堆)可能会被破坏。

并行线程确实提供了pthread_atfork功能-在理论上,你可以采取一切锁在节目分叉前,后释放他们, 也许让活着出来-但它是有风险的,因为你可能永远怀念之一。 而且,当然,其他线程的堆栈将不会被释放。



Answer 2:

这是很简单的。 多线程和进程的问题总是从共享数据产生的。 如果没有共享数据,则有可能产生的任何可能的问题。

在你的榜样共享数据是由主线程所拥有的队列 - 将在这里发生的任何潜在的竞争或竞争条件。 对“问题”的典型方法,这些问题涉及锁定方案 - 一个工作线程将插入任何数据之前锁定的队列,主线程将删除之前锁定的队列。



文章来源: fork in multi-threaded program