gpt4 book ai didi

multithreading - C++11 中的双重检查锁定模式?

转载 作者:行者123 更新时间:2023-12-04 02:10:46 25 4
gpt4 key购买 nike

C++11 的新机器模型允许多处理器系统可靠地工作,wrt。重组指令。

正如 Meyers 和 Alexandrescu 指出的那样,“简单”的双重检查锁定模式实现在 C++03 中并不安全

Singleton* Singleton::instance() {
if (pInstance == 0) { // 1st test
Lock lock;
if (pInstance == 0) { // 2nd test
pInstance = new Singleton;
}
}
return pInstance;
}

他们出现在 their article无论您作为程序员做什么,在 C++03 中编译器都有太多的自由:允许以您可以的方式重新排序指令 不是 确保您最终只有一个 Singleton 实例.

我现在的问题是:
  • 新的 C++11 机器模型的限制/定义现在是否限制了指令序列,即上述代码始终适用于 C++11 编译器?
  • 当使用新的库工具(而不是这里的模拟 Lock)时,这种单例模式的安全 C++11 实现现在看起来如何?
  • 最佳答案

    pInstance是一个常规指针,代码有潜在的数据竞争——指针(或任何内置类型,就此而言)的操作不能保证是原子的(编辑:或有序)

    pInstancestd::atomic<Singleton*> Lock内部使用 std::mutex为了实现同步(例如,如果 Lock 实际上是 std::lock_guard<std::mutex> ),代码应该是无数据竞争的。

    请注意,您需要 两者 显式锁定和原子 pInstance以实现适当的同步。

    关于multithreading - C++11 中的双重检查锁定模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6008715/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com