首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

线程与fork(二) (进程):把它们一起使用前,请谨慎考虑 (翻译)

2012-08-01 
线程与fork(2) (进程):把它们一起使用前,请谨慎考虑 (翻译)?int pthread_atfork(void (*prepare)(void), v

线程与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

      转载请著名作者,译者和出处。


热点排行