的线程安全性:在C++11中新增

Thread safety of ::new in C++11

本文关键字:C++11 新增 线程 安全性      更新时间:2023-10-16

我确信,在实践中,使用::new是线程安全的。我的问题是,标准的哪一部分提供了这种保证(如果有的话)?这是一个惯例吗?这是不是标准给了实现很大的自由度(比如关于每个数据类型的大小的相对宽松的约束)来支持各种各样的硬件?

我希望在C++11标准中的某个地方只有一行明确指定"::new的实现必须是线程安全的"。

我也想看到一些关于操作员新重载线程安全性的标准。我想它们也需要required才是线程安全的,但这些函数也不属于const=>线程安全的一揽子保证(在C++11中)。

谢谢!

我相信这是C++11标准隐含地保证的。如果不是,那么使用运算符new或new表达式可能会导致数据竞争,而这是标准不允许的。有关参考,请参见§17.6.5.9数据竞争避免

18.6.1.4数据竞赛[new.delete.datarace]

"运算符new和运算符delete的库版本,全局运算符new和操作员delete的用户替换版本,以及C标准库函数calloc、malloc、realloc和free不应引入数据竞赛(1.10)作为来自不同线程的并发调用的结果。对这些分配或解除分配特定存储单元的函数的调用应按单个总顺序进行,并且每次这样的解除分配调用应在该顺序的下一次分配(如果有)之前进行。"

您自己的覆盖或全局运算符的替换也应满足此要求。

另请参阅N3664"明确内存分配"提案,该提案更加强调了这一问题。

C++标准并不完全要求new是线程安全的。一些实现明确支持在单线程模式下构建C++代码,其中包括malloc()在内的C标准库可能不是线程安全的。当然,我们大多数人每天使用的平台确实提供线程安全分配。

即使您的平台提供了线程安全的new,如果您使用任何实现自己的operator new的库,或者您自己这样做,您仍然需要小心。当然可以编写一个仅在单个线程中工作的new——甚至可能是有意的!