【发布时间】:2021-03-11 11:43:59
【问题描述】:
我从许多讨论中了解到 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 是线程安全的,我不明白为什么这不起作用。提前致谢。
【问题讨论】:
-
您的 Meyers 单例 访问 是线程安全的。线程不能违反它是单例。但是,检索到的对象不会自动成为线程安全的。
标签: c++ multithreading singleton c++14