c++ - C++11 中::new 的线程安全

标签 c++ multithreading c++11 concurrency

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

我希望 C++11 标准中只有一行明确指定“::new 的实现必须是线程安全的”。

我也很想看到一些关于 operator new 重载的线程安全的标准术语。我想它们也需要要求是线程安全的,但这些函数也不属于 const => 线程安全(在 C++11 中)的全面保证。 p>

谢谢!

最佳答案

我相信这是由 C++11 标准隐式保证的。如果不是,则使用 operator new 或 new 表达式可能会导致数据竞争,而这是标准不允许的。作为引用,请参阅§17.6.5.9 避免数据竞争以及

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

"operator new 和 operator delete 的库版本、global operator new 和 operator delete 的用户替换版本以及 C 标准库函数 calloc、malloc、realloc 和 free 不应因此引入数据竞争 (1.10)来自不同线程的并发调用。对这些分配或释放特定存储单元的函数的调用应以单个总顺序发生,并且每个此类释放调用应在此顺序的下一次分配(如果有)之前发生。”

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

另见proposal N3664 "Clarifying Memory Allocation" ,这更加强调了这一点。

关于c++ - C++11 中::new 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26375732/

相关文章:

c++ - VC++ 2008 编译问题与 boost

xcode - 为什么我的 NSURLConnection 委托(delegate)方法没有被调用?

java - 方法减慢执行 paintComponent()

python - 如何将数据发送到正在运行的 python 线程?

c++ - MongoDB C++ 教程程序失败 : 'mongocxx::v_noabi::logic_error'

c++ - 当按值传递比通过 const 引用传递时的经验法则?

c++ - 如何使用 clang LibTooling 获取函数指针参数名称?

c++ - MSbuild 错误 : The builds tools for v140 (Platform Toolset = 'v140' ) cannot be found

c++ - 我如何转发声明已经过 typedef 的类?

c++ - C++0x 是否支持 std::wstring 与 UTF-8 字节序列的转换?