单例类和线程安全

时间:2015-06-10 13:08:05

标签: c++ multithreading thread-safety

class NumberStorage {
public:
    static NumberStorage& instance();
    double getNumber();
    void setNumber(double d);
private:
    NumberStorage() { number = 0.0; };
    double number;
};

NumberStorage& NumberStorage::instance()
{
    static NumberStorage instance;
    return instance;
}

我想我已经在某处读过以这种方式实现的instance()方法是线程安全的。它是否正确?我想我还必须在getNumber()和setNumber()中锁定成员变量号?我该怎么做(C ++ 11)?

1 个答案:

答案 0 :(得分:2)

  1. C ++ 11编译器使这个线程安全。静态变量只能由一个线程创建。
  2. 关于锁的其他问题都取决于线程应如何与您的方法一起使用。如果你有多个线程可以用同一块内存做某事 - 使用锁。
  3. 简单锁可以与std::unique_lockstd::mutex

    一起使用
    void setNumber(double number) {
        static std::mutex _setNumberLock;
        std::unique_lock _lock(&_setNumberLock);
    
        // your code
    }