C ++ статическая переменная инициализация и потоки - PullRequest
5 голосов
/ 17 октября 2011

У меня есть следующий бит кода C ++ 11, который использует потоки и инициализации статических переменных. Мой вопрос:

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

#include <iostream>
#include <thread>

class theclass
{
public:
   theclass(const int& n)
   :n_(n)
   { printf("aclass(const int& n){}\n"); }
   int n() const { return n_; } 
private:
   int n_;
};

int operator+(const theclass& c, int n)
{
   return c.n() + n;
}

void foo()
{
   static theclass x = 1;
   static theclass y = x + 1;
   printf("%d %d\n",x.n(),y.n());
}

int main()
{
   std::thread t1(&foo);
   std::thread t2(&foo);
   t1.join();
   t2.join();
   return 0; 
}

1 Ответ

8 голосов
/ 18 октября 2011

Код будет делать то, что вы ожидаете.См. §6.7.4

статические локальные переменные:

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

Другими словами, компилятор обеспечивает взаимодействие ваших потоков при инициализации статических локальных объектов.Каждый из них будет инициализирован один раз, и каждый поток будет иметь доступ к объекту только после его полной инициализации.

Компилятор будет создавать локальную переменную потока только при явном запросе с ключевым словом thread_local.

...