Wil*_*mKF 19 c++ multithreading fork pthreads
在使用pthreads的C++中,如果你的一个线程调用fork,你的其他线程会发生什么?
似乎线程不遵循.在我的情况下,我正在尝试创建一个守护进程,我使用fork()与父进程deamonize它.但是,在通过代码的新路径中,我在fork之前创建了一些线程,之后又创建了一些线程.是否有一种简单的方法可以将线程的所有权更改为新的分叉进程,而不是在fork之后移动我的所有线程创建?
在 POSIX 中,当多线程进程分叉时,子进程看起来完全像父进程的副本,但其中所有线程都停止并消失了。
如果线程持有锁,这是非常糟糕的。
出于这个原因,有一个粗略的机制调用pthread_atfork,您可以在这种情况下注册处理程序。
任何使用互斥锁的正确编写的程序模块(尤其是可重用的中间件)都必须调用pthread_atfork以注册一些处理程序,以便在进程碰巧调用fork.
除了互斥锁之外,线程还可以拥有其他资源,例如线程特定的数据,这些数据pthread_setspecific只能由线程访问(并且线程负责通过析构函数清理它)。
在子进程中,没有这样的析构函数运行。地址空间被复制了,但是线程及其线程特定的值不在那里,所以内存在子进程中泄漏。这也可以并且应该由处理pthread_atfork程序处理。
引用自http://thorstenball.com/blog/2014/10/13/why-threads-cant-fork/
If we call fork(2) in a multi-threaded environment the thread doing the call is now the main-thread in the new process and all the other threads, which ran in the parent process, are dead. And everything they did was left exactly as it was just before the call to fork(2).