【问题标题】:Singleton class and thread safety单例类和线程安全
【发布时间】:2015-06-10 13:08:05
【问题描述】:
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)?

【问题讨论】:

    标签: c++ multithreading thread-safety


    【解决方案1】:
    1. C++11 编译器使这个线程安全。静态变量只能由一个线程创建。
    2. 其他关于锁的问题都取决于线程应该如何使用您的方法。如果您有多个线程可以使用同一块内存执行某些操作,请使用锁。

    简单的锁可以与std::unique_lock和std::mutex一起使用:

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

    【讨论】:

    • 维克多:非常感谢您的回答! std::unique_lock 和 std::lock_guard<:mutex> 有什么区别?后者似乎在搜索 std::mutex 时弹出。互斥锁也可以是成员变量吗?
    • 当然 mutex 可以是类成员。关于std::lock_guard - see here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多