2015-06-10 3 views
0
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)?Одиночный класс и безопасность нитей

ответ

2
  1. Компилятор C++ 11 делает эту цепочку безопасной. Статические переменные могут создаваться только одним потоком.
  2. Другие вопросы о блокировках зависят от того, как потоки должны работать с вашими методами. Если у вас есть несколько потоков, которые могут что-то сделать с одним и тем же фрагментом памяти, используйте блокировки.

Простой замок может быть использован с std::unique_lock и std::mutex:

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

    // your code 
} 
+0

Виктор: Большое спасибо за Ваш ответ! В чем разница между std :: unique_lock и std :: lock_guard ? Последний, похоже, всплывает при поиске std :: mutex. Может ли мьютекс также быть переменной-членом? – Andy

+0

Конечно, мьютекс может быть членом класса. О 'std :: lock_guard' - [см. Здесь] (http://stackoverflow.com/questions/20516773/stdunique-lockstdmutex-or-stdlock-guardstdmutex) –

Смежные вопросы