c++ - 为什么 Meyer 的 Singleton 方法不是线程安全的?
问题描述
我从许多讨论中读到 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的值。如果 Meyers Singleton 是线程安全的,我不明白为什么这不起作用。提前致谢。
解决方案
由于a
.
void task1() {
for (int i = 0; i < 50000; ++i){
std::lock_guard<std::mutex> lock(mLock);
a++;
}
}
或定义
atomic<int> a;
对于两者,我得到 100000。
推荐阅读
- apache-spark - 如何使用 Spark SQL SPLIT 函数将输入传递给 Spark SQL IN 参数
- visual-studio-code - 修改 vscode `workspaceStorage` 文件夹路径
- laravel-5 - Laravel + Vue.js - 特定地址的 CORS 问题?
- python - 在自定义 Keras 层中使用带有 tf.py_func 的 python 代码
- java - Java JPA - 将多对多结构保存到数据库 - 错误:尝试从空的一对一属性分配 id
- python - 实时人脸识别在树莓派3上跑得很慢
- list - 多个列表haskell
- javascript - 我们可以将浏览器 JavaScript 的执行上下文从 Window 对象更改为其他对象吗?
- javascript - 用户将确切数量的元素输入到数组中
- stream - 没有元素的无限流