C++: как создать локальную/глобальную переменную потока

в этом коде:

int foo() {
   static int x;
}

- это x общим для всех потоков или локально в каждом потоке? Или это зависит от флага компилятора и / или компилятора, поэтому я не могу знать, что это такое из кода?

несколько вопросов (все они независимы от компилятора и флагов компилятора и ОС):

  1. как создать статическую переменную, которая является глобальной для всех потоков?
  2. как я могу создать статическую переменную, локальную для каждого нить?
  3. как создать глобальную переменную, которая является глобальной для всех потоков?
  4. как создать глобальную переменную, локальную для каждого потока?

Я думаю, что это не в C++ сам. (Это в C++0x?) Некоторые Boost lib, которые могут это сделать?

3 ответов


x является глобальным для всех потоков. Всегда, независимо от компилятора и/или флагов. Независимо от того, это в C++11 или C++03. Поэтому, если вы объявите регулярную глобальную или статическую локальную переменную, она будет совместно использоваться всеми потоками. В C++11 у нас будет thread_local ключевое слово. До тех пор вы можете использовать thread_specific_ptr из Boost.Нитка.


быстрая частичные ответы;

(это в C++0x?)

да. Но зависит и от поддержки C++0x вашего компилятора.

некоторый импульс lib, который может это сделать?

импульс.Нити. См.локальное хранилище потока в нем.

  1. как я могу создать статическую переменную, которая является глобальной для всех нити?
  2. как создать статическую переменную который является локальным для каждого нить?
  3. как я могу создать глобальную переменную, которая является глобальной для всех нити?
  4. как я могу создать глобальную переменную, локальную для каждого нить?

обратите внимание, что обычно static относится к длительности, а global - к области.

конструкторы потоков C++0x являются вариативными: вы можете передать любое число (и тип) аргументов. Все они доступны для вашего


вам нужно будет использовать какую-то кросс-платформенную библиотеку потоков (так как вы упомянули независимость ОС), но с учетом pthreads вы можете это сделать.

template <T>
class myVarStorage
{
    static std::map<int, T> store_;
public:
    myVarStorage();
    T getVar();
    void setVar(T);
}

template <T> void myVarStorage::setVar<T>(T var)
{
     store_[static_cast<int>pthread_self()] = var;
}

template <T> T myVarStorage::getVar()
{
     return store_[static_cast<int>pthread_self()]; //throws exception 
}

Я уверен, что код имеет ошибки в нем и должен рассматриваться как псевдо-код, так как я псевдо-программист, когда дело доходит до c++. :)