<分区>
Possible Duplicate:
fork in multi-threaded program
如果我有一个应用程序使用 fork() 并且可能被开发为多线程,安全地编写此类应用程序需要考虑哪些经验法则/准则?
标签 c++ c linux multithreading fork
<分区>
Possible Duplicate:
fork in multi-threaded program
如果我有一个应用程序使用 fork() 并且可能被开发为多线程,安全地编写此类应用程序需要考虑哪些经验法则/准则?
最佳答案
根据各种互联网文章(http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them、fork in multi-threaded program),基本的经验法则是:
(Main) Process[0] Monothread --> fork() --> (Child) Process[1] Multithreaded:OK!
如果 Process[1] 崩溃或乱用内存,它不会触及 Process[0] 的地址空间(除非您使用共享 R/W 内存...但这是它自己的另一个主题)。
在 Linux 中,默认情况下所有 fork()ed 内存都是 Copy On Write .鉴于 Process[0] 是单线程的,当我们调用 fork() 时,所有可能的互斥原语应该通常在解锁 状态。
(主)进程[0] 多线程 --> fork() -->(子)进程[1] 单线程/多线程:不好!
如果您fork() 一个多线程进程,您的互斥体和许多其他线程同步原语可能在 Process[1] 中处于未定义状态。您可以使用 pthread_atfork() 解决问题,但如果您使用库,您不妨掷骰子并希望幸运。因为通常你不会(不想)知道库的实现细节。
fork() 进入多线程进程的优点是您可以更快地操作/读取/聚合您的数据(在子进程中),而不必关心进程的稳定性 < em>fork() 来自(主)。如果您的主进程有一个很多内存的数据集并且您不想复制/重新加载它以安全地处理另一个进程(子进程)中的数据,这将很有用。这样原始流程就稳定且独立于数据聚合/操作流程 (fork()ed)。
当然,这意味着原始进程通常会比以多线程方式开发时慢。但同样,这是您可能希望为提高稳定性而付出的代价。
如果您的主进程是多线程的,避免使用fork()。以稳定的方式实现它会是一个适当的困惑。
干杯
关于c++ - 线程和 fork()。我该如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12868724/