Ema*_*ele 7 c c++ linux multithreading fork
可能重复:
在多线程程序中fork
如果我有一个使用fork()并且可能被开发为多线程的应用程序,那么为安全地编程这种应用程序需要考虑哪些拇指规则/指南?
根据各种互联网文章(例如(http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them,多线程程序中的 fork)),基本的经验规则是:
(主)进程 [0] 单线程 --> fork() --> (子)进程 [1] 多线程:好的!
如果Process[1]崩溃或内存混乱,它不会触及Process[0]的地址空间(除非您使用共享 R/W 内存......但这是它自己的另一个主题)。
在 Linux 中,默认情况下所有fork()ed内存都是Copy On Write。鉴于Process[0]是单线程的,当我们调用fork()时,所有可能的互斥原语通常应处于解锁状态。
(主)进程 [0] 多线程 --> fork() --> (子)进程 [1] 单线程/多线程:不好!
如果您fork()一个多线程进程,您的互斥体和许多其他线程同步原语可能会在 Process[1] 中处于未定义状态。您可以使用pthread_atfork()解决问题,但如果您使用库,您不妨掷骰子并希望幸运。因为通常您不(想)了解库的实现细节。
fork()到多线程进程的优点是您可以更快地操作/读取/聚合数据(在子进程中),而不必关心您从(主进程) fork()的进程的稳定性。如果您的主进程有大量内存的数据集,并且您不想复制/重新加载它以安全地处理另一个进程(子进程)中的数据,那么这非常有用。这样,原始过程是稳定的并且独立于数据聚合/操作过程(fork()ed)。
当然,这意味着原始进程通常会比以多线程方式开发时慢。但同样,这也是您可能想要为获得更高稳定性而付出的代价。
如果您的主进程是多线程的,请避免使用fork()。以稳定的方式实现它将会是一个相当混乱的情况。
干杯