C++: как создать локальную/глобальную переменную потока
в этом коде:
int foo() {
static int x;
}
- это x
общим для всех потоков или локально в каждом потоке? Или это зависит от флага компилятора и / или компилятора, поэтому я не могу знать, что это такое из кода?
несколько вопросов (все они независимы от компилятора и флагов компилятора и ОС):
- как создать статическую переменную, которая является глобальной для всех потоков?
- как я могу создать статическую переменную, локальную для каждого нить?
- как создать глобальную переменную, которая является глобальной для всех потоков?
- как создать глобальную переменную, локальную для каждого потока?
Я думаю, что это не в C++ сам. (Это в C++0x?) Некоторые Boost lib, которые могут это сделать?
3 ответов
x является глобальным для всех потоков. Всегда, независимо от компилятора и/или флагов. Независимо от того, это в C++11 или C++03. Поэтому, если вы объявите регулярную глобальную или статическую локальную переменную, она будет совместно использоваться всеми потоками.
В C++11 у нас будет thread_local
ключевое слово. До тех пор вы можете использовать thread_specific_ptr из Boost.Нитка.
быстрая частичные ответы;
(это в C++0x?)
да. Но зависит и от поддержки C++0x вашего компилятора.
некоторый импульс lib, который может это сделать?
импульс.Нити. См.локальное хранилище потока в нем.
- как я могу создать статическую переменную, которая является глобальной для всех нити?
- как создать статическую переменную который является локальным для каждого нить?
- как я могу создать глобальную переменную, которая является глобальной для всех нити?
- как я могу создать глобальную переменную, локальную для каждого нить?
обратите внимание, что обычно 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++. :)