双重检查和锁定模式在c++(而不是11)中有效吗

Does double check and lock pattern works in c++ (not 11)?

本文关键字:有效 检查和 锁定 模式 c++      更新时间:2023-10-16

一方面,我有一篇写在2004年的文章:http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf

它说使用volatile这个词没有帮助,这在2004年可能是真的。

但另一方面,有这个(维基百科):

如果指向资源的指针是用C++关键字volatile声明的,则可以在Visual C++2005及更高版本中实现双重检查锁定。Visual C++2005保证volatile变量将表现为围栏指令,防止编译器和CPU使用获取语义(用于读取)和释放语义(用于写入)来安排读取和写入。[9] 在Visual C++的早期版本中没有这样的保证。但是,如果指针声明在代码的其他地方可见,则将指向资源的指针标记为volatile可能会迫使编译器在其他地方将其视为围栏,从而损害其他地方的性能,即使在没有必要的情况下也是如此。

来源:http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Microsoft_Visual_C.2B.2B

所以,如果我不使用"内存屏障",我可以在带有volatile关键字的c++中使用双重检查和锁定吗?

这两篇文章都是正确的。您不能在C++98中以便携方式编写双重检查锁定。然而,Visual C++提供了超出C++标准要求的额外保证,以确保volatile能够工作。这对VC来说相当容易做到,至少当它以x86为目标时是这样,因为x86无论如何都具有发布语义。