__thread是GCC內置的線程局部存儲設施,存取效率可以和全局變量比較。
__thread變量在每一個線程裏面都有一份獨立的實體,各個線程的值互不干擾。可以用來修飾那些帶有全局性並且值可能發生改變,但是又不值得用全局變量保護的對象。
使用規則:一般來說只能修飾POD類型(類似整形指針的標量,不帶有自定義的構造,賦值,拷貝,析構的類型,二進制內容可以任意的memset,memcpy等,且內容可以復原),不能修飾class類型,可以用來修飾全局變量,函數內的靜態變量,不能修飾函數的局部變量或者class的普通成員變量,__thread的變量值只能初始化爲編譯器常量,編譯器就需要確定值。
CountDownLatch g_latch(1);
__thread int var = 0;
void worker_functor(void* arg)
{
var++;
printf("threadid = %d, var'address = %p, var = %d\n", Thread::GetCurrentThreadId(), &var, var);
g_latch.CountDown();
}
void worker_functor1(void* arg)
{
g_latch.Wait();
printf("threadid = %d, var'address = %p, var = %d\n", Thread::GetCurrentThreadId(), &var, var);
}
int main()
{
Thread thd1(std::bind(worker_functor, nullptr));
thd1.Start();
Thread thd2(std::bind(worker_functor1, nullptr));
thd2.Start();
thd1.Join();
thd2.Join();
return 0;
}
結果:
threadid = 6666, var'address = 0x7ffff651f6fc, var = 1
threadid = 6667, var'address = 0x7ffff5d1e6fc, var = 0