2013-05-20 2 views
1

У меня есть одноэлементный класс, и я уверен, что первый вызов синглтона выполняется только одним потоком. Я реализовал singleton с ленивой инициализацией. C++ на singleton

class MySingleton : private boost::noncopyable { 
public: 

    /** singleton access. */ 
    static MySingleton & instance() 
    { 
     static MySingleton myInstance; 
     return myInstance; 
    } 

    void f1(); 
    void f2(); 
    void f3(); 
    void f4(); 

private: 

    MySingleton(); 

}; 

Теперь я другой класс фабрики, который ответствен для создания всех одиночек в одном потоке enviorment. Singleton может использоваться из нескольких потоков, а методы защищены от мьютексов.

Первый вопрос

Является ли этот подход accetable?

Второй вопрос

Я сложный класс, который должен быть потокобезопасными.
Этот класс должен быть синглом. Как это может вызвать вызов различных методов класса потоком. Например.

{ 
    MySingletonLock lock; 
    // Other thread must wait here. 
    MySingleton::instance().f1(); 
    MySingleton::instance().f3(); 
} 

Как я могу получить это?

+2

Почему у вас есть фабрика, которая создает синглеты? звучит очень запутанно. –

+7

Синглтон никогда не бывает приемлемым. Не используйте Синглтон, это ужасный, ужасный образец. Кроме того, вы не смогли предотвратить один экземпляр, ваш класс имеет стандартный конструктор по умолчанию, чтобы каждый мог создавать больше экземпляров. Без предотвращения множественных экземпляров все, что у вас есть, это шаблон GlobalState, который является чистым. Сделайте себе одолжение и измените свой дизайн прямо сейчас. –

+0

Верно, что Джонатан ... это похоже на то, что у вас есть классы и экземпляры, но давайте создадим глобальное. плюс singleton очень безопасен! –

ответ

1

Ответ на ваш второй вопрос:

class MyProtectedSingleton: public MySingleton 
{ 
public: 
    void f1() 
    { 
     MySingletonLock lock; 
      // Other thread must wait here. 
     MySingleton::instance().f1();  
    } 

    void f2() 
    { 
     MySingletonLock lock; 
     // Other thread must wait here. 
     MySingleton::instance().f2();  
    } 
}; 

вызова f1, f2, и т.д. через обертки в MyProtectedSingleton.

+0

Это защищает только вызов f1() ... Я хочу, чтобы вызов f1() f2() ... был как бы «атомарным» –

+0

У вас есть f2 protected: D Сколько функций у вас есть? И это практически не связано с мощью встроенного. – Liviu

+0

(minor) Вы написали «accetable», но я не могу отредактировать ваш вопрос за такую ​​небольшую ошибку. – Liviu