我从许多讨论中了解到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,因为这个类是线程安全的。然而,我不能得到100000值的a。我不知道为什么这不工作,如果迈尔斯单例是线程安全。提前谢谢。
发布于 2021-03-11 15:07:20
因为a中的数据竞争。
void task1() {
for (int i = 0; i < 50000; ++i){
std::lock_guard<std::mutex> lock(mLock);
a++;
}
}或定义
atomic<int> a;两种情况下我都能得到100000。
https://stackoverflow.com/questions/66581889
复制相似问题