我从许多讨论中读到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。