2016-08-24 2 views
1

Meyers Singleton зависит от того, что local static variable initialization is atomic.C++ - статическая инициализация переменных с = atomic?

Я создаю нечто подобное, но я хочу, чтобы синглтон фактически был одним из нескольких производных типов. Метод базового класса getInstance() должен вызвать фабрику, которая вернет соответствующий тип.

Моя первая идея состоит в том

static Foo *instance = FooFactory(...); 

8.5p2 из N3337, кажется, указывает, что это строго инициализация и не инициализация и присваивание и интерпретировать, что означает, что весь оператор является атомарным. Это верно?

Если бы не заявление

static Foo *instance(FooFactory(...)); 

быть разными?

Edit 8.5.2 -> 8.5.p2

ответ

1

8.5.2 является "[dcl.init.string]" и, похоже, не имеет отношения к делу. Я думаю, вы имеете в виду 8.5 para2.

Да, это строго инициализация (в частности, Имитация копирования - см. 8.5 пара.14).

Если декларация находится внутри функции, то, как the answer to the linked question shows, все хорошо.

Однако, если это статическая переменная в области пространства имен, то я не вижу ничего, что требует инициализации для потоковой безопасности. (Это проблема только в том случае, если инициализация создает потоки), но я уверен, что это так.)

+0

Если I aver видит статическую инициализацию, которая создает потоки, я сразу же вызываю проблемы с менеджером о разработчике, который его написал :) – SergeyA

+0

Особенно интересно, если мы говорим о Windows DLL - где почти все делается внутри DllMain (что и есть статический init), может привести к тупиковой ситуации при блокировке статического загрузчика :-) –

1

Поскольку C++ 11, инициализация статических переменных, которые являются локальными для функций атомная и Потокобезопасные, да так, ваши строки кода потокобезопасны и практически эквивалент. (Синтаксис вашей первой версии требует конструктор копирования, но никакой компилятор его не сгенерирует).

Однако неясно, какие аргументы будут предоставлены вашей фабричной функции, и откуда они будут взяты?

+0

Можете ли вы привести главу и стих для инициализации статических переменных в области пространства имен *, являющихся потокобезопасными? §6.7 [stmt.dcl] p4: говорит, что «заявления о декларации» являются потокобезопасными, но я думаю, что это относится только к объявлениям в области блоков. (другими словами, статические декларации внутри функции). Чтобы быть ясным - было бы здорово, если бы вы могли. –

+0

@MartinBonner, никогда не хотел ничего говорить об области пространства имен. Контекст вопроса, безусловно, связан с функцией-scope static. Прояснится, чтобы быть на 100% понятным. – SergeyA

+0

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

1

variable_type variable_name = initializer всегда инициализируется, а не по умолчанию и назначается. [Dcl.init]/15 имеет

инициализации, которая происходит в форме

T x = a; 

, а также в передачи аргументов, возврата функции, вызов исключения (15.1), обработка исключения (15.3), а инициализация агрегатного члена (8.5.1) называется копированием-инициализацией. [Примечание. Копирование-инициализация может вызвать ход (12.8). Примечание]