首页 > 解决方案 > 为什么 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 是线程安全的,我不明白为什么这不起作用。提前致谢。

标签: c++multithreadingsingletonc++14

解决方案


由于a.

void task1() {
    for (int i = 0; i < 50000; ++i){
        std::lock_guard<std::mutex> lock(mLock);
        a++;
    }
}

或定义

atomic<int> a;

对于两者,我得到 100000。


推荐阅读