Конструктор вызывается дважды в статическом синглтон-классе в разных потоках - PullRequest
0 голосов
/ 28 января 2019

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

Реализация вполне стандартная, статическая функция, которая возвращает ссылку на статический член в этой функции, я попытался вернуть указатель, создать необработанный указатель и вернутьон и конструктор всегда вызываются дважды.

class Singleton
{
public:
    static Singleton &getInstance()
    {
        static Singleton instance;
        return instance;
    }

    // public methods

private:
    Singleton();
    Singleton(const Singleton &) = delete;
    Singleton(Singleton &&) = delete;
    Singleton &operator=(const Singleton &) = delete;
    Singleton &operator=(Singleton &&) = delete;

    // member variables
};

Поток, пытающийся получить доступ к синглтону, был создан с использованием std :: async (std :: launch :: async, lambda)

Я ожидал, что конструктор экземпляра вызывается только в первый раз, когда я вызываю эту функцию, но второй экземпляр экземпляра имеет другое направление памяти.

1 Ответ

0 голосов
/ 28 января 2019

Стандарт C ++ 11 гарантирует, что статические локальные переменные создаются только один раз.Это оставляет нам следующие опции:

  1. Ваш компилятор не совместим с C ++ 11.Возможно, это потому, что он старый или вы используете неправильные параметры.
  2. Ваш синглтон генерирует (неперехваченное) исключение, и инициализация повторяется снова.
  3. Ваш конструктор вызывает getInstance (), которыйприводит к неопределенному поведению.

Выше предполагается, что вы применили шаблон Singleton правильно .Вы могли бы также каким-то образом запутаться, но я не могу сказать, потому что вы не предоставили полный код.

Вся информация взята из cppreference на статические локальные переменные.

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