首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Meyer的Singleton方法不是线程安全的?

为什么Meyer的Singleton方法不是线程安全的?
EN

Stack Overflow用户
提问于 2021-03-11 11:43:59
回答 1查看 557关注 0票数 0

我从许多讨论中了解到Meyers Singleton提供线程安全。为了实现这一点,我用C++14编写了一个简单的代码,如下所示。

代码语言:javascript
复制
#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。我不知道为什么这不工作,如果迈尔斯单例是线程安全。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-03-11 15:07:20

因为a中的数据竞争。

代码语言:javascript
复制
void task1() {
    for (int i = 0; i < 50000; ++i){
        std::lock_guard<std::mutex> lock(mLock);
        a++;
    }
}

或定义

代码语言:javascript
复制
atomic<int> a;

两种情况下我都能得到100000。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66581889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档