我确信,在实践中,::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/