gpt4 book ai didi

C++ 和双重检查锁定的风险 : Workaround?

转载 作者:行者123 更新时间:2023-11-30 04:25:06 30 4
gpt4 key购买 nike

我正在阅读一篇关于“Scott Meyers 的双重检查锁定的危险”的论文。 http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf

作者给出了双重检查锁失败的原因(第 3 页,第 4 节)。我正在考虑如何在不使用 C++11 的情况下解决这个问题。并不是说我不想使用 C++ 11,而是想看看是否可以在不使用 std::call_once 等函数的情况下解决它

class Singleton {
public:
static Singleton* instance();

private:
static Singleton* pInstance;
int someData_;
};


Singleton* Singleton::instance()
{
class SeqAssign{
public:
SeqAssign(Singleton*& pInst, Singleton* pNew):
pInstance(pInst), pNewedInst(pNew){
}
~SeqAssign(){
pInstance = pNewedInst;
}

private:
Singleton*& pInstance;
Singleton* pNewedInst;
};

if (pInstance == 0) { // 1st test
Lock lock;
if (pInstance == 0) { // 2nd test
SeqAssign seq(pInstance, new Singleton);
}
}
return pInstance;
}

Singleton::instance() 中的代码能否在多线程环境中工作,因为为 SeqAssign 类调用构造函数和析构函数的顺序是确定性的。

最佳答案

没有。从多个线程访问变量 pInstance。它被修改。该代码具有未定义的行为。我不确定是什么你的东西 SeqAssign 会做,因为它没有引入任何额外的线程间排序。

在标准 C++ 中无法使双重检查日志工作;全部的解决方案涉及原子变量(可能使用内联汇编程序)或线程本地存储。

关于C++ 和双重检查锁定的风险 : Workaround?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12348534/

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