Member 13409686 Ответов: 1

Как создать одноэлементный шаблон проектирования потокобезопасным в стандартном C++? Когда механизм двойной проверки не полностью защищен?


является ли он полностью потокобезопасным в C++ 98, если нет, то как мы можем достичь потокобезопасного синглтона в C++98 ?

MySingleton * GetInstance()
{
      if (m_pOnlyOneInstance == NULL)
      {
            EnterCriticalSection();
            if (m_pOnlyOneInstance == NULL)
            // Solution 1 and 2 gaps addressed by moving
            // critical section block and by re-doing this check!
            {
                  m_pOnlyOneInstance = new MySingleton();
            }
            LeaveCriticalSection();
      }
      return m_pOnlyOneInstance;
}


Что я уже пробовал:

Во многих постах написано,что он не полностью потокобезопасен, в C++11 call_once() решил проблему singleton thread_safe.Как это сделать в C++98?

1 Ответов

Рейтинг:
7

Andrew Kirillov

Привет,

Регистрация "C++ и опасности двойной проверки блокировки"[^] статья Скотта Мейерса и Андрея Александреску, чтобы выяснить, почему образец кода, который у вас есть, терпит неудачу.

В статье действительно приводится пример потокобезопасного синглтона. Да, он действительно страдает от проблемы производительности, которую вы пытаетесь решить с помощью двойной проверки. Но это потокобезопасно. Что касается производительности, то вам нужно иметь представление о том, как часто вы собираетесь вызывать метод GetInstance (), прежде чем пытаться найти для него решение.


CPallini

5.