Реализация C ++ ThreadLocal - PullRequest
       0

Реализация C ++ ThreadLocal

4 голосов
/ 26 июля 2011

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

Я читал о ThreaLocal в Википедии, и он говорит:

C ++ 0x вводит ключевое слово thread_local.Кроме того, различные реализации компилятора C ++ предоставляют особые способы объявления локальных переменных потока:

Кто-нибудь знает объявление gcc для этого и, возможно, его использование?

Ответы [ 4 ]

3 голосов
/ 28 июля 2011

С помощью 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
3 голосов
/ 26 июля 2011

Обычно это часть библиотеки потоков, используемой вашей ОС.В Linux локальное хранилище потоков обрабатывается с помощью функций pthread_key_create, pthread_get_specific и pthread_set_specific.Большинство потоковых библиотек инкапсулируют это и предлагают интерфейс C ++.В Boost это thread_specific_ptr ...

2 голосов
/ 26 июля 2011

VC10 имеет новый класс с именем combinable , который дает вам то же самое, с большей гибкостью.

1 голос
/ 26 июля 2011

В MSVC он называется __declspec(thread) вместо thread_local.

См. http://msdn.microsoft.com/en-us/library/9w1sdazb(v=vs.80).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...