unix - 在多线程(带有 pthreads)进程中 fork() 之后,所有可重入函数都可以安全使用吗?

标签 unix pthreads fork

我正在开发一个 C++ 项目,该项目使用 pthreads 进行多线程处理,但有时也需要fork。我读过分散在代码中的警告,指出 fork 之后不应该进行内存分配,但在找到 this article 之前我并不知 Prop 体原因。 。我总结了几点:

  1. 当主线程fork时,其他线程可能正在调用某些库函数; fork不会复制其他线程,从而使调用永远卡住;

  2. malloc使用全局变量,并使用锁来实现线程安全。因此,如果父进程的一个线程恰好位于 malloc 调用的中间,则 fork 的子进程实际上拥有一个 malloc调用永远卡住,永远无法恢复。 printf 等也是如此。

我意识到这与 reentrancy 有关。 ,一个文章中没有提到的术语。该声明似乎相当于:

  1. 如果在父进程的主线程之外调用了一些非进入函数f,子进程就无法调用f.

  2. malloc 是不可重入的。

这是否正确,意味着所有可重入函数在fork之后都可以安全使用?或者我是否仍然遗漏了 pthreads 和传统 UNIX 进程模型如何交互的一些令人讨厌的角落?

如果我是对的,那么还有一个问题:众所周知,malloc 是不可重入的,但是 C++ 的 new 呢?我用谷歌搜索了这一点,但相关结果并不多(主要是因为很难找到正确的"new":),但至少有一个说法是 new is reentrant 。还有一个relevant question关于整个 C++ 标准库,没有令人满意的答案。

PS。对于感兴趣的人来说,C++ 项目是 fish shell 。 shell 肯定需要 fork ,并且使用线程来提高响应能力。

最佳答案

正如 @cnicutar 所指出的,文章确实提到您可以在 fork 后调用异步安全函数。并根据this article ,可重入函数始终是无异步的(但不是相反),因此在 fork 后可以安全地调用。

我的主要问题到此结束。我将在另一个线程中提出其他问题(没有双关语)。

更新:我问了附加问题here .

关于unix - 在多线程(带有 pthreads)进程中 fork() 之后,所有可重入函数都可以安全使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14090368/

相关文章:

linux - 查找具有大小和时间并按时间戳排序的命令

c++ - 创建线程时出现段错误

c - 从多个管道读取数据的正确方法是什么?

c - 作为进程子进程,如何知道哪个文件描述符是父进程

c - 为什么 pthread_cond_signal 不起作用?

当父级中有 exit(0) 时,无法理解 fork() 的输出

c++ - 在一行中读取 SMTP 邮件

java - 未反射(reflect)对 Java 程序的更改

c - 帮助在 C 中实现 GNU Readline

php - 安装了 Pthreads 扩展,但仍然出现 PHP fatal error : Class 'Thread' not found