C++11中::new的线程安全性

13

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

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

我也很想看到一些关于重载操作符new的线程安全性的标准化内容。我想象他们也需要被强制要求是线程安全的,但是这些函数也不属于const=> thread safe的总括保证(在C++11中)。

谢谢!


为什么标准会向你保证你的operator new重载是线程安全的呢?这是你的程序,你的问题。 - MSalters
@MSalters - 出于相同的原因,它使const => 线程安全。因为如果您在代码中没有确保这个保证,那么您无法安全地与标准库进行交互。你能自己踢到自己的脚吗?是的,就像C++中的任何事情一样...但这几乎不是重点。 - Mark
2个回答

17

我相信C++11标准隐式地保证了这一点。如果没有这个保证,那么使用operator newnew表达式可能会导致数据竞争,而这是不被标准允许的。请参见§17.6.5.9 数据竞争避免以及

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

“库版本的operator newoperator delete、全局operator newoperator delete的用户替换版本,以及C标准库函数callocmallocreallocfree不应由于来自不同线程的并发调用而引入数据竞争(1.10)。分配或释放特定存储单元的这些函数的调用应该在一个总顺序中发生,并且每个这样的释放调用应该在此顺序中下一个分配(如果有)之前发生。”

你自己的覆盖或者全局操作符的替换也应该满足这个要求。

此外,还请参见提案N3664“澄清内存分配”,它更加强调了这个问题。


3

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接