C ++的新运算符是可重入的(或异步安全的)吗?

时间:2012-12-30 12:08:45

标签: c++ reentrancy

背景在我的this question。简而言之,我必须在多线程C ++程序中 fork,所以我想知道在仅限于可重入函数时我能做多少,而且最重要的一个事物就是动态的记忆。

所以,mallocknown to be non-reentrant。但是C ++的new呢?我搜索了相关结果并不多(主要是由于难以找到正确的“新”),但至少有一个声明new is reentrant。关于整个C ++标准库还有一个relevant question没有令人满意的答案。

编辑:我想标准没有说明这一点,所以我最关心的是主要的实现。

3 个答案:

答案 0 :(得分:2)

我查看了gcc libsupc++clang libc++来源,以替换符合标准的C ++新/删除运算符 - 以支持本机SIMD对齐在malloc无法保证的平台上的要求。

它们基本上是mallocfree的包装器,带有一些EH逻辑等等。我不是语言律师,但除非两者都错了,我认为可以安全地得出结论:不,他们不可重入。

答案 1 :(得分:1)

线程安全和重新进入完全相同。

AFAIK,C ++ ISO标准不保证newdelete运营商的线程安全。但是g++实现确实提供了线程安全(这是它变慢的原因之一)。

答案 2 :(得分:1)

标准允许 new只是malloc的包装,因此如果malloc不可重入,new也可以。< / p>