2009-06-27 13 views
12

Ниже приведена известная реализация одноэлементного шаблона в C++.
Тем не менее, я не совсем уверен, является ли его потокобезопасным.
Основываясь на ответах на аналогичный вопрос, заданный здесь ранее, кажется, что он является потокобезопасным.
Это так?Реализация нитевидных однопоточных решений в C++

//Curiously Recurring Template Pattern  
//Separates a class from its Singleton-ness (almost).  
#include <iostream> 
using namespace std; 

template<class T> class Singleton { 
    Singleton(const Singleton&); 
    Singleton& operator=(const Singleton&); 
protected: 
    Singleton() {} 
    virtual ~Singleton() {} 
public: 
    static T& instance() { 
    static T theInstance; 
    return theInstance; 
    } 
}; 

// A sample class to be made into a Singleton 
class MyClass : public Singleton<MyClass> { 
int x; 
protected: 
    friend class Singleton<MyClass>; 
    MyClass() { x = 0; } 
public: 
void setValue(int n) { x = n; } 
    int getValue() const { return x; } 
}; 
+0

Почему вы сделали это WIKI? Это абсолютно правильный вопрос. – JaredPar

+0

вы не дали никаких причин, почему * вы считаете, что реализация шаблона не является потокобезопасной. Пожалуйста, сделай. – gogole

+0

Какова цель класса друзей здесь? может кто-нибудь ответить? –

ответ

13

Нет, это не потокобезопасно, потому что статический локал не защищен каким-либо образом. По умолчанию статический локаль не является потокобезопасным. Это означает, что вы можете столкнуться следующие вопросы

  • Конструктор для одноточечного работает более чем один раз
  • Отнесение к статическому не гарантируется атомарным, следовательно, вы могли видеть частичное назначение в многопоточных сценариях
  • Возможно, еще несколько, что мне не хватает.

Подробнее о записи блога Раймонда Чена о том, почему статическая статистика C++ по умолчанию не является потокобезопасной.

+1

Отличный ресурс Jared. – Ankur

+0

да спасибо за ссылку, это открыло мне глаза. –

+0

так в основном это означает, что это невозможно сделать OS-агностик-синглтон с использованием C++? т. е. вам всегда нужен какой-то критический раздел или аналогичный для него? –

0

Это не потолочный, если вы не сконфигурируете свой компилятор для создания потокового кода для статических доступов.

Однако, лучше, чтобы код был автономным, поэтому я бы добавил мьютекс здесь и там.

1

ЭТО НЕ Потокобезопасная. Чтобы стать потокобезопасным, вы должны добавить проверку перед блокировкой (блокировка семафора) и другую проверку после блокировки. И тогда вы уверены, что даже при одновременном вызове из разных потоков вы предоставляете один экземпляр.

0

Если вы до сих пор интерес по этой теме, и если вы используете C++ 11 стандартный компилятор вы можете найти here предложение шаблона одноэлементных в многопоточной среде.

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

  • Нет связанных вопросов^_^