c ++ потокобезопасный статический конструктор - PullRequest
4 голосов
/ 17 февраля 2010

Дано:

void getBlah() {
  static Blah* blah = new Blah();
  return blah;
}

Возможно ли в многопоточном режиме, что новый Blah () вызывается более одного раза?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 17 февраля 2010

Стандарт C ++ не гарантирует безопасности потоков при статической инициализации - вы должны рассматривать статическую инициализацию как требующую явной синхронизации.

Цитата Александра Гесслера дает:

Если контроль вводит декларацию одновременно в то время как объект инициализировано, параллельное выполнение должен ждать завершения инициализация

взято из черновика C ++ 0x и не отражает текущий стандарт C ++ или поведение многих компиляторов C ++.

В текущем стандарте C ++ этот отрывок гласит:

Если элемент управления повторно входит в объявление (рекурсивно), пока объект находится инициализировано, поведение не определено

2 голосов
/ 17 февраля 2010

Нет.Но обратите внимание, что указатель на Blah равен static.

6.7 Оператор объявления

4 [...] В противном случае такой объект инициализируетсяпервый раз контроль проходит через свою декларацию;такой объект считается инициализированным по завершении его инициализации.Если инициализация завершается с помощью исключения, инициализация не завершена, поэтому она будет повторена при следующем входе элемента управления в объявление

0 голосов
/ 17 февраля 2010

EDIT: это относится к черновику C ++ 0x.

Цитирование стандарта (6.7-4):

Если элемент управления вводит объявление одновременно, пока объект находится в процессеинициализировано, параллельное выполнение должно ждать завершения инициализации

Насколько я понимаю, статическая инициализация, подобная этой, является поточно-ориентированной.

...