c++ - 线程和 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-themfork in multi-threaded program),基本的经验法则是:

  1. (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() 时,所有可能的互斥原语应该通常解锁 状态。

  2. (主)进程[0] 多线程 --> fork() -->(子)进程[1] 单线程/多线程:不好!
    如果您fork() 一个多线程进程,您的互斥体和许多其他线程同步原语可能在 Process[1] 中处于未定义状态。您可以使用 pthread_atfork() 解决问题,但如果您使用库,您不妨掷骰子并希望幸运。因为通常你不会(不想)知道库的实现细节。

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

当然,这意味着原始进程通常会比以多线程方式开发时慢。但同样,这是您可能希望为提高稳定性而付出的代价。

如果您的主进程是多线程的,避免使用fork()。以稳定的方式实现它会是一个适当的困惑

干杯

关于c++ - 线程和 fork()。我该如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12868724/

相关文章:

c - 使用 ATMEGA328p 的移位寄存器

linux - 使用 netcat 并写入远程 shell 的标准输入

linux - 为 Linux 发行版做贡献

c++ - 如何在C应用程序中使用C++ DLL?

c - 使用atoi,从字符串中获取整数

c++ - 将 VST 音效/插件应用于音频文件

c - C语言结构中 "dereferencing ` void *' pointer"警告的解决方案?

linux - 如何查看在应用程序命令期间访问了哪些文件?

c++ - 我可以用 Android 制作一个相当原生的 C++ 应用程序吗?

c++ - Windows C++ 静态库在初始化期间无法访问外部方法