线程和fork()。 我该如何处理?

可能重复:
分叉multithreading程序中

如果我有一个使用fork()的应用程序,并且可能被开发为multithreading,那么安全编程这种应用程序需要考虑哪些大拇指规则/准则?

Solutions Collecting From Web of "线程和fork()。 我该如何处理?"

基本的拇指规则,根据各种互联网文章,如:( http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them,fork 在多线程程序 )是:

  1. (Main)进程[0] Monothread – > fork() – >(Child)进程[1]多线程OK!
    如果Process [1]与内存崩溃或混乱, 它将不会触及Process [0]的地址空间(除非使用共享R / W内存…但这是它自己的另一个主题)。
    在Linux中,默认情况下,所有的fork()ed内存是Copy On Write 。 考虑到Process [0]是单线程的,当我们调用fork()时,所有可能的相互排斥原语通常应该处于解锁状态。

  2. (Main)Process [0] Multithreaded – > fork() – >(Child)Process [1] Mono / MultithreadBAD!
    如果你fork()一个多线程进程,你的互斥量和其他许多线程同步原语可能在Process [1]中处于一个未定义的状态 。 你可以使用pthread_atfork()来解决问题,但是如果你使用库,你可能会掷骰子,希望能够幸运。 因为一般你不(想)知道库的实现细节。

fork()到多线程进程的优点是你可以更快地操作/读取/聚合数据(在Child进程中),而不必关心你从(Main) fork()的进程的稳定性。 如果您的主进程拥有大量内存的数据集并且您不希望复制/重新加载它以安全地处理另一个进程(Child)中的数据,那么这非常有用。 这样,原来的过程是稳定的,独立于数据聚合/操作过程( fork()ed )。

当然,这意味着原来的流程通常会比以多线程方式开发时慢。 但是,再次,这是你可能想要支付更多的稳定的代价。

如果你的主进程是多线程的话, 不要使用fork() 。 这将是一个稳定的方式实施它是一个适当的混乱

干杯

在Linux上,线程是按照进程来实现的。 换句话说,线程实际上只是一个fork() ,主要是共享内存,而不是完全写入内存。 这意味着,当你在一个线程(main或者other)中使用fork()时,你最终将复制所有线程的整个共享内存空间,并且从你调用fork()的线程的特定线程存储中复制。

现在所有这些听起来不错,但这并不意味着这将会发生什么或者工作得很好。 如果您想要创建一个克隆进程,请在启动任何其他线程之前尝试执行fork,然后使用只读虚拟内存来使分叉进程保持最新的当前内存值。

所以尽管可能有效,但我只是建议测试,并尝试先找到另一种方法。 并准备了很多:

 Segmentation fault