gpt4 book ai didi

multithreading - 在父级创建线程后调用fork()的正确方法?

转载 作者:行者123 更新时间:2023-12-03 13:16:00 25 4
gpt4 key购买 nike

我正在实现一个使用第三方插件的复杂应用程序,并且我想在子进程中运行插件代码以进行隔离。父进程需要是多线程的,但是我已经阅读了 fork may be unsafe in multithreaded processes,特别是如果您不立即调用execve和那个 pthread_atfork is not a complete solution

其他复杂的应用程序对此有何作用?我知道Chrome会同时使用子进程和多线程,因此必须可行。

最佳答案

fork()在多线程程序中的行为是明确定义的。成功后,子进程将只有一个线程,即与父程序中的fork()相同的线程。尽管这可能是一个问题,但实际上是否是问题取决于情况。

何时fork()给多线程程序带来问题?
fork()出现在多线程程序中的问题的主要原因是子进程取决于互斥锁,条件变量等,因此不再依赖其他线程来进行操作。例如,如果 child 需要获取一个尚未持有的进程专用互斥锁,则可能是该互斥锁在派生时是由另一个线程持有的。在那种情况下,它永远不会在子进程中被释放,因为在子进程中不存在任何可以释放它的线程。

多线程程序的问题是什么时候fork() 不是

涉及fork()的常见习惯用法之一是通过执行另一个程序立即跟进它。没问题,无论父线程是否线程化。

或者,如果子进程不依赖任何有问题的资源,则无需执行任何特殊操作。请注意,从这个意义上说,进程共享的线程间对象不是“有问题的”。这种情况相当普遍,听起来可能是您的情况。

否则,如果父级的派生线程可以并且确实获取了子级在 fork 之前将需要的所有进程专用线程间资源,这不是问题。在某些情况下,由pthread_atfork()注册的处理程序可以帮助解决此问题,但在其他情况下,在fork调用的直接环境中完成此操作更有意义。

总体

您已经提出了这个问题,就好像fork()编码对于多线程程序来说是一个深层而麻烦的问题。当然,这是一个应该考虑的问题,通常最好避免同时使用多个线程和多个进程。因此,由于您希望多个进程具有独立的地址空间以及可能将插件加载到其中的 namespace ,因此无论您现在使用线程在哪里,都应该考虑使用独立的进程。另一方面,如果您进行一些思考和照顾,则可能会使它适合多线程进程来派生 child 并与他们进行交互。

关于multithreading - 在父级创建线程后调用fork()的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42678617/

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