我确信,在实践中,使用::new是线程安全的。我的问题是,标准的哪一部分提供了这种保证,如果有的话?这是个会议吗?在这种情况下,标准为实现提供了很大的自由度(比如对于每种数据类型的大小的相对宽松的约束),以支持多种硬件吗?
我希望C++11标准中只有一行明确指定“::new的实现必须是线程安全的”。
我也想看看一些关于操作者新超载的线程安全的标准。我认为它们也需要是线程安全的,但这些函数也不属于const =>线程安全(在C++11中)的全面保证范围之内。
谢谢!
发布于 2014-10-15 08:45:26
我相信C++11标准隐含地保证了这一点。如果不是,那么使用运算符new或new表达式可能会导致数据争用,这是标准所不允许的。有关参考资料,请参阅第17.6.5.9节数据竞赛避免以及
18.6.1.4数据竞赛new.delete.dataraces
“操作员新建和操作符删除的库版本、全局操作符新建和操作符删除的用户替换版本以及C标准库函数calloc、malloc、realloc和free,不应由于来自不同线程的并发调用而引入数据竞赛(1.10)。对分配或释放特定存储单元的这些函数的调用应以单一的总顺序进行,并且每个此类取消分配调用都应在下一次分配(如果有的话)之前按此顺序进行。”
您自己的重写或您自己对全局操作员的替换也应该满足这一要求。
也请看这个proposal N3664 "Clarifying Memory Allocation",它更加强调这个问题。
发布于 2014-10-15 06:33:07
C++标准并不直接要求new是线程安全的。有些实现显式支持在单线程模式下构建C++代码,其中C标准库(包括malloc() )可能不是线程安全的。当然,我们大多数人每天使用的平台都提供线程安全分配。
即使您的平台提供了一个线程安全的new,如果您使用任何实现它们自己的operator new的库,或者您自己也这样做,您仍然需要小心。当然可以编写一个只在一个线程中工作的new --甚至可能是故意的!
https://stackoverflow.com/questions/26375732
复制相似问题