如何安全地 fork() 多线程进程?
How to safely fork() a multi-threaded process?
我的程序依赖于第 3 方静态库。该库将启动一个由全局变量初始化触发的线程,该线程将锁定一个互斥锁,我无法更改第 3 方的代码。在 main() 内的程序中,我将调用 fork() 并退出以使我的程序成为守护进程。
上述行为可能会导致死锁,因为在 main() 之后未初始化全局变量时,派生的子进程中的锁无法解锁。
所以现在我要做的是在加载第 3 方静态库之前分叉进程。那么有没有合适的方法来实现呢?
So now what I want to do is to fork the process before the 3rd party static library is loaded. So is there a proper way to achieve this?
"Before the static library is loaded" 不是问题,静态库是在构建时链接的,而不是在运行时动态加载的。
The library will start a thread triggered by the initialization of a global variable
您应该考虑使用设计更好的库,或者与维护者合作,提出一个更好的初始化方案。 main 之前的生活通常是个坏主意。在 main 之前生成线程是一个非常糟糕的主意。替代方案可能是,使用在调用库的 API 时触发的惰性静态,或者更好的是,引入显式 init 函数,或使用上下文指针,以便用户可以管理库状态。抱歉,听起来这东西是轮胎着火了,除非你花点时间修理它,否则没有明智的方法来分叉它。
使用另一个执行守护进程的程序,然后执行您的程序。
有些服务主管特别要求他们的服务不能双叉。这样他们就可以检测到服务何时退出。作为 运行 在监督之下已经意味着他们没有控制终端,所以没有必要分离。
我的程序依赖于第 3 方静态库。该库将启动一个由全局变量初始化触发的线程,该线程将锁定一个互斥锁,我无法更改第 3 方的代码。在 main() 内的程序中,我将调用 fork() 并退出以使我的程序成为守护进程。
上述行为可能会导致死锁,因为在 main() 之后未初始化全局变量时,派生的子进程中的锁无法解锁。
所以现在我要做的是在加载第 3 方静态库之前分叉进程。那么有没有合适的方法来实现呢?
So now what I want to do is to fork the process before the 3rd party static library is loaded. So is there a proper way to achieve this?
"Before the static library is loaded" 不是问题,静态库是在构建时链接的,而不是在运行时动态加载的。
The library will start a thread triggered by the initialization of a global variable
您应该考虑使用设计更好的库,或者与维护者合作,提出一个更好的初始化方案。 main 之前的生活通常是个坏主意。在 main 之前生成线程是一个非常糟糕的主意。替代方案可能是,使用在调用库的 API 时触发的惰性静态,或者更好的是,引入显式 init 函数,或使用上下文指针,以便用户可以管理库状态。抱歉,听起来这东西是轮胎着火了,除非你花点时间修理它,否则没有明智的方法来分叉它。
使用另一个执行守护进程的程序,然后执行您的程序。
有些服务主管特别要求他们的服务不能双叉。这样他们就可以检测到服务何时退出。作为 运行 在监督之下已经意味着他们没有控制终端,所以没有必要分离。