讓我們先從一張code (Coliru):線程局部變量
#include <iostream>
#include <thread>
using namespace std;
struct A
{
thread_local static A* p_a;
thread_local static int i;
};
thread_local int A::i;
thread_local A* A::p_a;
int main()
{
A::p_a = new A;
auto lambda = [](A* a)
{
a->i = 1; // Prints 1 (below, of course)
std::cout << a->i << std::endl;
};
std::thread t(std::bind(lambda, A::p_a));
t.join();
// Prints 0 (it hasn't been modified)
std::cout << A::p_a->i << std::endl;
return 0;
}
正如大家所看到的,第二個線程修改的A::i
它的線程本地副本,即使我訪問它來自另一個線程的另一個線程本地對象。這是預期的行爲嗎?因爲除非我將指針或引用傳遞給我想要讀取的外部thread_local對象,否則無法使用「引用者」從另一個線程獲取信息。
使用「referer」,我引用管理或可以讓你從其線程訪問自己的thread_local變量的內容。但這是不可能的!任何表達式產生一個thread_local變量,無論從哪個人(我做了不同的測試,甚至是訪問函數),都通過使用讀線程的thread_local實例結束。
我不確定使用'thread_local'在線程之間進行通信符合'thread_local'存儲的精神。爲什麼不使用普通的'static'? – Galik
我只是....「瞭解行爲」(或試圖)。 –
啊,它的一個*語法*問題。僅僅因爲你正在使用的語法看起來像是取消引用'A'指針,你不是。編譯器認爲它是一個'static'並忽略指針,並直接針對單個(在這種情況下是每個線程)靜態實例。整個'thread_local'事務實際上與此無關。 – Galik