线程和分叉().我该怎么处理

Threads and fork(). How can I deal with that?

本文关键字:处理 分叉 线程      更新时间:2023-10-16

可能的重复:
多线程程序中的fork

如果我有一个使用fork()的应用程序,并且可能被开发为多线程的,那么要安全地编程这类应用程序,需要考虑哪些经验法则/指南?

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

  1. (主)进程[0]单线程-->分叉()-->(子)进程[1]多线程
    如果Process[1]内存崩溃或混乱,将不会接触Process[0]的地址空间(除非您使用共享R/W内存…但这是另一个主题)
    在Linux中,默认情况下,所有分叉()的内存都是写时复制。假设Process[0]是单线程的,当我们调用fork()时,所有可能的互斥原语通常都应该是处于解锁状态。

  2. (主)进程[0]多线程-->分叉()-->(子)进程[1]单线程/多线程BAD
    如果fork()一个多线程进程,您的互斥对象和许多其他线程同步原语可能在process[1]中处于未定义状态。你可以使用pthread_atfork(),但如果你使用库,你也可以掷骰子,希望运气好。因为通常你不想知道库的实现细节。

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

当然,这意味着原始进程通常会比以多线程方式开发时慢。但同样,这也是你可能想要为更稳定而付出的代价。

如果您的主进程是多线程的,则禁止使用fork()。以稳定的方式实现它将是一个的烂摊子

干杯

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

现在,所有这些听起来都很好,但这并不意味着这就是会发生的事情或效果良好。如果您想创建一个克隆的进程,请尝试在启动任何其他线程之前执行fork,然后使用只读虚拟内存使派生的进程与当前内存值保持同步。

因此,尽管它可能有效,但我只是建议进行测试,并首先尝试找到另一种方法。并为很多做好准备:

Segmentation fault