多線程 thread_local 類型 thread_local變數是C++ 11新引入的一種存儲類型。 thread_local關鍵字修飾的變數具有線程周期(thread duration), 這些變數(或者說對象)線上程開始的時候被生成(allocated), 線上程結束的時候被銷毀(deall ...
多線程 thread_local 類型
thread_local變數是C++ 11新引入的一種存儲類型。
- thread_local關鍵字修飾的變數具有線程周期(thread duration),
- 這些變數(或者說對象)線上程開始的時候被生成(allocated),
- 線上程結束的時候被銷毀(deallocated)。
- 並且每 一個線程都擁有一個獨立的變數實例(Each thread has its own instance of the object)。
thread_local
可以和static
與extern
關鍵字聯合使用,這將影響變數的鏈接屬性(to adjust linkage)。
例子:
#include <iostream>
#include <thread>
struct S
{
S() {
printf("S() called i=%d\n", i);
}
int i = 0;
};
//thread_local S gs;
S gs;
void foo()
{
gs.i += 1;
printf("foo %p, %d\n", &gs, gs.i);
}
void bar()
{
gs.i += 2;
printf("bar %p, %d\n", &gs, gs.i);
}
int main()
{
std::thread a(foo), b(bar);
a.join();
b.join();
}
github源代碼
執行結果:結構體S只生成了一個對象實例,並且2個線程是共用這個實例的,可以看出實例的記憶體地址相同
S() called i=0
bar 0x55879165501c, 2
foo 0x55879165501c, 3
如果把:S gs;加上thread_local關鍵字,
thread_local S gs;
執行結果:結構體S在每個線程中都生成了一個實例,可以看出實例的記憶體地址不相同。
S() called i=0
bar 0x7f23eb2506f8, 2
S() called i=0
foo 0x7f23eba516f8, 1