线程与fork(2) (进程):把它们一起使用前,请谨慎考虑 (翻译)
?
int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));?
?
它允许指定在 fork 被调用时的处理函数:
- prepare 新进程产生之前被调用。
- parent 新进程产生之后在父进程被调用。
- child 新进程产生之后,在子进程被调用。
调用的目的是在 fork(2) 被调用时,处理多线程程序的关键部分(本文开始部分提及)。一个常见的场景时在 prepare 处理函数中加锁,在 parent 处理函数解锁和在 child 处理函数重新初始化锁。
?
总结?
在我看来,fork(2) 在多线程程序中有太多的问题,几乎没有办法去正确地执行它。唯一清晰的方式是在调用 fork(2) 之后立即在子进程中调用 execve(2) 。如果你需要做更多的东西,请使用别的方式(而不是这种多线程混搭多进程的方式),真的。从我的经验看来,并不值得去尝试使用 fork(2) ,即使有pthread_atfork() 的情况下。我真的希望你在遇到本文提到的问题之前,读到这篇文章。
?
引用- fork() description from The Open Group Single UNIX Specification
- Ulrich Drepper's blog: Secure File Descriptor Handling
- pthread_atfork()
本文译自:?http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them
作者:?Damian Pietras
转载请著名作者,译者和出处。