双重检查和锁定模式在c++(而不是11)中有效吗
Does double check and lock pattern works in c++ (not 11)?
一方面,我有一篇写在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无论如何都具有发布语义。
相关文章:
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 如果检查和内联条件之间是否存在编译器差异
- 如何检查和处理前提条件
- 证明两指针方法有效(对和)
- QT版本检查和Qoverload未在范围中定义
- 使用范围检查和带符号的size_type扩展std::vector
- 如何检查和替换数组 C++ 中的元素
- 双重检查和锁定模式在c++(而不是11)中有效吗
- 在尺寸n的3D阵列中有效检查相邻的体素
- 有效的算法来检查是否存在具有相同值的行和列
- 在c++中有效检查浮点数组中的值变化
- 在 Visual Studio 13 中检查和设置C++项目生成标志
- 如何处理pam_authenticate对有效用户和密码的PAM_AUTHTOK_RECOVERY_ERR返回值
- 检查和关闭句柄
- 使用c++检查和添加数据到protobuff中
- c++ lua支持与语法检查和功能完成
- 我如何检查和处理非常接近零的数字
- 棘手的空检查和调用
- 数组边界检查和输入验证
- 用gcc编译的visual C++在VC++14中是有效的和无效的