gpt4 book ai didi

multithreading - 多线程程序中的fork

转载 作者:行者123 更新时间:2023-12-03 11:29:17 26 4
gpt4 key购买 nike

我听说在程序中混合使用 fork 和线程可能会很成问题,通常会导致神秘的行为,尤其是在处理共享资源(例如锁、管道、文件描述符)时。但我从来没有完全理解到底有什么危险,什么时候会发生。如果在该领域具有专业知识的人能够更详细地解释什么是陷阱以及在这种环境中编程时需要注意什么,那就太好了。

例如,如果我想编写一个从各种不同资源收集数据的服务器,我想到的一个解决方案是让服务器产生一组线程,每个线程调用另一个程序来完成实际工作,打开管道从 child 那里取回数据。这些线程中的每一个都响应自己的工作,它们之间没有数据交换,当收集到数据时,主线程有一个队列,这些工作线程只会将结果放入队列中。这个解决方案会出现什么问题?

请不要仅通过“回答”我的示例场景来缩小您的回答范围。任何与示例无关但有助于提供干净设计的建议、替代解决方案或经验都会很棒!谢谢!

最佳答案

当您确实有一些线程正在运行时, fork 的问题在于 fork 仅复制调用它的一个线程的 CPU 状态。就好像所有其他线程都立即死亡,无论它们在哪里。

这样做的结果是没有释放锁,并且共享数据(例如 malloc 堆)可能会损坏。

pthread 确实提供了 pthread_atfork函数 - 理论上,你可以在 fork 之前获取程序中的每一个锁,之后释放它们,也许让它活着 - 但这是有风险的,因为你总是可能错过一个。而且,当然,其他线程的堆栈不会被释放。

关于multithreading - 多线程程序中的fork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1235516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com