线程和分叉().我该怎么处理
Threads and fork(). How can I deal with that?
可能的重复:
多线程程序中的fork
如果我有一个使用fork()的应用程序,并且可能被开发为多线程的,那么要安全地编程这类应用程序,需要考虑哪些经验法则/指南?
根据各种互联网文章,如(http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them,多线程程序中的fork)是:
-
(主)进程[0]单线程-->分叉()-->(子)进程[1]多线程:好
如果Process[1]内存崩溃或混乱,将不会接触Process[0]的地址空间(除非您使用共享R/W内存…但这是另一个主题)
在Linux中,默认情况下,所有分叉()的内存都是写时复制。假设Process[0]是单线程的,当我们调用fork()时,所有可能的互斥原语通常都应该是,处于解锁状态。 -
(主)进程[0]多线程-->分叉()-->(子)进程[1]单线程/多线程:BAD
如果fork()一个多线程进程,您的互斥对象和许多其他线程同步原语可能在process[1]中处于未定义状态。你可以使用pthread_atfork(),但如果你使用库,你也可以掷骰子,希望运气好。因为通常你不想知道库的实现细节。
fork()进入多线程进程的优点是,您可以更快地(在子进程中)操作/读取/聚合数据,而不必关心您从(Main)中分叉()的进程的稳定性。如果你的主进程有一个的数据集,有很多的内存,并且你不想复制/重新加载它来安全地处理另一个进程中的数据,这很有用(Child)。这样,原始进程是稳定的,并且独立于数据聚合/操作进程(fork()ed)。
当然,这意味着原始进程通常会比以多线程方式开发时慢。但同样,这也是你可能想要为更稳定而付出的代价。
如果您的主进程是多线程的,则禁止使用fork()。以稳定的方式实现它将是一个的烂摊子。
干杯
在Linux上,线程是按照进程来实现的。换句话说,线程实际上只是一个主要共享内存的fork()
,而不是完全复制写内存。这意味着,当您在线程(main或other)中使用fork()
时,您最终会复制所有线程的整个共享内存空间,以及从中调用fork()
的线程的线程特定存储空间。
现在,所有这些听起来都很好,但这并不意味着这就是会发生的事情或效果良好。如果您想创建一个克隆的进程,请尝试在启动任何其他线程之前执行fork,然后使用只读虚拟内存使派生的进程与当前内存值保持同步。
因此,尽管它可能有效,但我只是建议进行测试,并首先尝试找到另一种方法。并为很多做好准备:
Segmentation fault
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 如何在不继承手柄的情况下分叉处理
- 线程和分叉().我该怎么处理
- 用于处理许多客户端 c++ 的分叉服务器