背景在我的this question。简而言之,我必须在多线程C ++程序中 fork
,所以我想知道在仅限于可重入函数时我能做多少,而且最重要的一个事物就是动态的记忆。
所以,malloc
是known to be non-reentrant。但是C ++的new
呢?我搜索了相关结果并不多(主要是由于难以找到正确的“新”),但至少有一个声明new
is reentrant。关于整个C ++标准库还有一个relevant question没有令人满意的答案。
编辑:我想标准没有说明这一点,所以我最关心的是主要的实现。
答案 0 :(得分:2)
我查看了gcc
libsupc++和clang
libc++来源,以替换符合标准的C ++新/删除运算符 - 以支持本机SIMD对齐在malloc
无法保证的平台上的要求。
它们基本上是malloc
和free
的包装器,带有一些EH逻辑等等。我不是语言律师,但除非两者都错了,我认为可以安全地得出结论:不,他们不可重入。
答案 1 :(得分:1)
线程安全和重新进入完全相同。
AFAIK,C ++ ISO标准不保证new
和delete
运营商的线程安全。但是g++
实现确实提供了线程安全(这是它变慢的原因之一)。
答案 2 :(得分:1)
标准允许 new
只是malloc
的包装,因此如果malloc
不可重入,new
也可以。< / p>