Обратный звонок в синглтон-класс - PullRequest
1 голос
/ 30 июня 2011

Я использую класс синглтона с потоком, который вызывает в синглтоне. Во время обзора меня спросили, почему я использовал указатель this вместо экземпляра singleton.

Мой код с предлагаемыми изменениями.

class myClass : public threadWrapper
{
public:
    static myClass& instance()
    {
        static myClass instance;
        return instance;
    }

    // This is the callback that I have implemented
    static void callback(void *me)
    {
        if (me != NULL)
            static_cast<myClass*>(me)->doCallback();
    }

    // This is the suggested callback
    static void callback2(void *me)
    {
        instance().doCallback();
    }

    // caller gets instance and then calls initialise()
    int initialise()
    {  
        if (initialised)
            return ERROR_ALREADY_INITIALISED;

        // Initialise the class

        // my thread startup call
        // thread wrapper class initialisation that calls pthread_create that runs the callback method with this as a parameter
        // priority is a global value that difines the relative priority of the various threads.
        threadWrapper::Initialise(priority, callback, this);
        initialised = true;

    }
private:
    myClass() : initialised(false) {;}

    void doCallback(void);

    bool initialised;

    static const int 
}

Так есть ли существенная разница в скорости между ними?

ThreadWrapper обязателен в существующей базе кода, и мне не разрешено использовать boost.

Мое оправдание состояло в том, что если бы нам нужно было сделать это не единичным, то потребовалось бы меньше изменений.

1 Ответ

5 голосов
/ 30 июня 2011

Разница в скорости практически отсутствует.

Что касается качества кода, Singletons довольно ужасны, и я лично выбрал бы обе формы, , особенно в многопоточной среде.Однако при условии, что для этого уже слишком поздно.

Дело в том, что если вы передадите указатель на объект, почему бы просто не сделать этот объект глобальным во-первых?И если вы, это должно быть строго напечатано.И потом, вы просто ... оборачиваете метод-член в статический метод?Зачем беспокоиться?Любой, у кого есть указатель на класс, может просто вызвать метод.Это просто безумие.

Редактировать: Если вы застряли с существующим дизайном, то вторая версия на определенно лучше первой и не медленнее.Даже если у вас есть существующий код, который зависит от Singleton, лучше реорганизовать то, что вы можете, чтобы не зависеть от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...