__thread關鍵字

__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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章