双重检查和锁定模式是不是适用于 C++(不是 11)?
Posted
技术标签:
【中文标题】双重检查和锁定模式是不是适用于 C++(不是 11)?【英文标题】:Does double check and lock pattern works in c++ (not 11)?双重检查和锁定模式是否适用于 C++(不是 11)? 【发布时间】:2014-02-10 21:58:36 【问题描述】:一方面我有这篇文章,写于 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
所以如果我不使用“内存屏障”,我可以在 c++ 中使用 volatile 关键字进行双重检查和锁定吗?
【问题讨论】:
IMO 并非如此,因为在 C++11 之前,该语言没有保证内存模型,这意味着您甚至无法轻松谈论诸如多线程执行和线程交互之类的事情。跨度> 【参考方案1】:两篇文章都是正确的。您不能在 C++98 中可移植地编写双重检查锁定。但是,Visual C++ 提供了超出 C++ 标准要求的额外保证,以确保 volatile 能够正常工作。这对 VC 来说相当容易做到,至少在它针对 x86 时是这样,因为 x86 无论如何都有获取-释放语义。
【讨论】:
以上是关于双重检查和锁定模式是不是适用于 C++(不是 11)?的主要内容,如果未能解决你的问题,请参考以下文章