的线程安全性:在C++11中新增
Thread safety of ::new in C++11
我确信,在实践中,使用::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
——甚至可能是有意的!
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 的线程安全性:在C++11中新增