首页 > 解决方案 > 如何安全地 fork() 多线程进程?

问题描述

我的程序依赖于第 3 方静态库。该库将启动一个由全局变量初始化触发的线程,该线程将锁定互斥体,我无法更改第 3 方的代码。在我的 main() 程序中,我将调用 fork() 并退出以使我的程序成为守护程序。

上述行为可能导致死锁,因为在 main() 之后未初始化全局变量时,无法在 fork 的子进程中解锁锁。

所以现在我要做的是在加载第 3 方静态库之前分叉进程。那么有没有合适的方法来实现这一点?

标签: forkstatic-librariesdeadlock

解决方案


所以现在我要做的是在加载第 3 方静态库之前分叉进程。那么有没有合适的方法来实现这一点?

“在加载静态库之前”不是问题,静态库是在构建时链接的,而不是在运行时动态加载的。

该库将启动一个由全局变量初始化触发的线程

您应该考虑使用设计更好的库,或者与维护者一起提出一个经过深思熟虑的初始化方案。main 之前的生活通常是个坏主意。在 main 之前生成线程是一个非常糟糕的主意。替代方案可能是,使用在调用库的 API 时触发的惰性静态,或者更好的是,引入显式 init 函数,或使用上下文指针,以便用户可以管理库状态。抱歉,这听起来像是轮胎起火了,在你花一些时间修理它之前,没有理智的方法来分叉它。


推荐阅读