我正在开发一个 C++ 项目,该项目使用 pthreads 进行多线程处理,但有时也需要fork
。我读过分散在代码中的警告,指出 fork
之后不应该进行内存分配,但在找到 this article 之前我并不知 Prop 体原因。 。我总结了几点:
当主线程
fork
时,其他线程可能正在调用某些库函数;fork
不会复制其他线程,从而使调用永远卡住;malloc
使用全局变量,并使用锁来实现线程安全。因此,如果父进程的一个线程恰好位于 malloc 调用的中间,则 fork 的子进程实际上拥有一个 malloc调用永远卡住,永远无法恢复。printf
等也是如此。
我意识到这与 reentrancy 有关。 ,一个文章中没有提到的术语。该声明似乎相当于:
如果在父进程的主线程之外调用了一些非进入函数
f
,子进程就无法调用f
.malloc
是不可重入的。
这是否正确,意味着所有可重入函数在fork
之后都可以安全使用?或者我是否仍然遗漏了 pthreads 和传统 UNIX 进程模型如何交互的一些令人讨厌的角落?
如果我是对的,那么还有一个问题:众所周知,malloc
是不可重入的,但是 C++ 的 new
呢?我用谷歌搜索了这一点,但相关结果并不多(主要是因为很难找到正确的"new":),但至少有一个说法是 new
is reentrant 。还有一个relevant question关于整个 C++ 标准库,没有令人满意的答案。
最佳答案
正如 @cnicutar 所指出的,文章确实提到您可以在 fork 后调用异步安全函数。并根据this article ,可重入函数始终是无异步的(但不是相反),因此在 fork 后可以安全地调用。
我的主要问题到此结束。我将在另一个线程中提出其他问题(没有双关语)。
更新:我问了附加问题here .
关于unix - 在多线程(带有 pthreads)进程中 fork() 之后,所有可重入函数都可以安全使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14090368/