Unix 在多线程(使用pthreads)进程中执行fork()后,是否可以安全地使用所有可重入函数? 我正在研究一个C++项目,它采用了PultMultuthToMultType,但现在也需要 Fooge< /Cord>。我读过分散在代码中的警告,即在fork之后永远不应该进行内存分配,但我在发现之前不知道确切的原因。我总结了以下几点: > P>当主线程 Foes/Cult>S时,其他线程可能处于某个库函数调用的中间;code>forking不会复制其他线程,使调用永远被卡住

Unix 在多线程(使用pthreads)进程中执行fork()后,是否可以安全地使用所有可重入函数? 我正在研究一个C++项目,它采用了PultMultuthToMultType,但现在也需要 Fooge< /Cord>。我读过分散在代码中的警告,即在fork之后永远不应该进行内存分配,但我在发现之前不知道确切的原因。我总结了以下几点: > P>当主线程 Foes/Cult>S时,其他线程可能处于某个库函数调用的中间;code>forking不会复制其他线程,使调用永远被卡住,unix,pthreads,fork,Unix,Pthreads,Fork,malloc使用全局变量,并使用锁来实现线程安全。因此,如果父进程中的一个线程恰好在 MaloC 调用中,则代码>线程安全,如果在线程A中安全地调用 f>代码>,而线程B位于 f < /代码>调用中。code>f是可重入的,因为您可以在线程B中调用它,并期望它永远不会阻塞。因此,使用锁来保护f调用,阻止线程A中的f调用,直到线程B中的调用完成为止,这是实现线程安全的一种可接受的方法,但它不是可重入的。“异步安全”意味着可重入不是线程安全的。@cnicutar根据,可重入函数始终是无异步的,但不是

malloc
使用全局变量,并使用锁来实现线程安全。因此,如果父进程中的一个线程恰好在<代码> MaloC 调用中,则<<代码> Fooe<代码> ED子进程有效地使用了<代码> MaloC 永远无法恢复的调用。对于
printf
等,也是这样

我意识到这与文章中没有提到的术语有关。该索赔似乎相当于:

  • 如果在父进程的主线程外调用了一些非进入函数
    f
    ,则子进程不能调用
    f

  • malloc
    是不可重入的

  • 这是否正确,意味着在
    fork
    ing之后可以安全地使用所有可重入函数?还是我仍然缺少pthread和传统UNIX进程模型如何交互的一些令人讨厌的方面

    如果我是对的,还有另一个问题:
    malloc
    是不可重入的,但是C++的
    new
    呢?我在谷歌上搜索了一下,没有多少相关的结果(主要是因为很难找到正确的“新”:),但至少有一种说法是这样的。还有一个关于C++标准库的问题,没有令人满意的答案。
    对于感兴趣的C++项目是。Shell肯定需要分叉,线程被用来提高响应能力。

    正如@cnicutar所指出的,文章确实提到分叉后可以调用异步安全函数。根据,可重入函数总是异步自由的(但不是相反),因此在分叉后调用是安全的

    我的主要问题到此为止。我将在另一个帖子中问另外一个问题(没有双关语)


    更新:我问了另外一个问题。

    线程中提到了可重入性:它提到了“异步安全函数”。@cnicutar我在维基百科上没有找到“异步安全”,所以我认为它是线程安全的同义词<代码> f>代码>线程安全,如果在线程A中安全地调用<代码> f>代码>,而线程B位于<代码> f < /代码>调用中。code>f是可重入的,因为您可以在线程B中调用它,并期望它永远不会阻塞。因此,使用锁来保护
    f
    调用,阻止线程A中的
    f
    调用,直到线程B中的调用完成为止,这是实现线程安全的一种可接受的方法,但它不是可重入的。“异步安全”意味着可重入不是线程安全的。@cnicutar根据,可重入函数始终是无异步的,但不是相反的。我的主要问题到此为止。我将在另一个线程中询问另一个问题。:)@cnicutar也许你可以把你的(简短)答案放在答案区。;)