С помощью gcc вы можете использовать __thread
для объявления локальной переменной потока.Однако это ограничено типами POD с постоянными инициализаторами и не обязательно доступно на всех платформах (хотя доступно и в Linux, и в Windows).Вы используете его как часть объявления переменной, как если бы вы использовали thread_local
:
__thread int i=0;
i=6; // modify i for the current thread
int* pi=&i; // take a pointer to the value for the current thread
В системах POSIX вы можете использовать pthread_key_create
и pthread_[sg]et_specific
для доступа к локальным данным потока, которыми вы сами управляетеи в Windows вы можете использовать TlsAlloc
и Tls[GS]etValue
для одного и того же конца.
Некоторые библиотеки предоставляют обертки для них, которые позволяют использовать типы с конструкторами и деструкторами.Например, boost предоставляет boost::thread_specific_ptr
, который позволяет хранить динамически размещенный объект, локальный для каждого потока, а моя библиотека just :: thread предоставляет * 1018.* макрос, который близко имитирует поведение ключевого слова thread_local
из C ++ 0x.
, например, с использованием boost:
boost::thread_specific_ptr<std::string> s;
s.reset(new std::string("hello")); // this value is local to the current thread
*s+=" world"; // modify the value for the current thread
std::string* ps=s.get(); // take a pointer to the value for the current thread
или с использованием just :: thread:
JSS_THREAD_LOCAL(std::string,s,("hello")); // s is initialised to "hello" on each thread
s+=" world"; // value can be used just as any other variable of its type
std::string* ps=&s; // take a pointer to the value for the current thread