单例class和线程安全
Singleton class and 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() 中锁定成员变量 number?我该怎么做 (C++11)?
- C++11 编译器使该线程安全。静态变量只能由一个线程创建。
- 关于锁的其他问题都取决于线程应该如何与您的方法一起工作。如果您有多个线程可以使用同一块内存执行某些操作 - 使用锁。
简单锁可以与std::unique_lock
和std::mutex
一起使用:
void setNumber(double number) {
static std::mutex _setNumberLock;
std::unique_lock _lock(&_setNumberLock);
// your code
}
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() 中锁定成员变量 number?我该怎么做 (C++11)?
- C++11 编译器使该线程安全。静态变量只能由一个线程创建。
- 关于锁的其他问题都取决于线程应该如何与您的方法一起工作。如果您有多个线程可以使用同一块内存执行某些操作 - 使用锁。
简单锁可以与std::unique_lock
和std::mutex
一起使用:
void setNumber(double number) {
static std::mutex _setNumberLock;
std::unique_lock _lock(&_setNumberLock);
// your code
}