为什么 Meyer 的单例方法不是线程安全的?



我从许多讨论中读到Meyers Singleton提供线程安全性。为此,我在C++14中编写了一个简单的代码,如下所示。

#include <iostream>
#include <thread>
class SingletonClass {
public:
static SingletonClass& Instance() {
static SingletonClass instance;
return instance;
}

void task1() {
for (int i = 0; i < 50000; ++i)
a++;
}
int getA() {return a;}
private:
SingletonClass()= default;
~SingletonClass()= default;
SingletonClass(const SingletonClass&)= delete;
SingletonClass& operator=(const SingletonClass&)= delete;
int a;
};
void callSingleton() {
SingletonClass::Instance().task1();
}
int main() {
std::thread t1(callSingleton);
std::thread t2(callSingleton);

t1.join();
t2.join();
std::cout << "a: " << SingletonClass::Instance().getA() << std::endl;
return 0;
}

我预计a应该是100000,因为这个类是线程安全的。但是,我无法获得a的100000值。如果Meyers Singleton是线程安全的,我不明白为什么这不起作用。提前谢谢。

由于a中的数据竞争。

void task1() {
for (int i = 0; i < 50000; ++i){
std::lock_guard<std::mutex> lock(mLock);
a++;
}
}

或定义

atomic<int> a;

两者,我得到100000。

相关内容

  • 没有找到相关文章

最新更新