双重检查和锁定模式是否适用于c ++(而不是11)?

时间:2014-02-10 21:58:37

标签: c++ multithreading locking

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

它说使用volatile这个词无济于事,2004年可能也是如此。

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

  

如果使用C ++关键字volatile声明指向资源的指针,则可以在Visual C ++ 2005及更高版本中实现双重检查锁定。 Visual C ++ 2005保证volatile变量将作为fence指令运行,防止编译器和CPU排列读取和写入具有获取语义(用于读取)和释放语义(用于写入)。[9]在以前版本的Visual C ++中没有这样的保证。但是,将指向资源的指针标记为volatile可能会损害其他地方的性能,如果指针声明在代码中的其他位置可见,则强制编译器将其视为其他地方的栅栏,即使它不是必需的。

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

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

1 个答案:

答案 0 :(得分:0)

这两篇文章都是正确的。你无法在C ++ 98中编写双重检查锁定。但是,Visual C ++提供了超出C ++标准所要求的额外保证,以确保volatile能够正常工作。这对于VC来说相当容易,至少在它定位到x86时,因为x86无论如何都有获取释放语义。