【发布时间】:2016-09-18 11:57:14
【问题描述】:
让我们从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 的线程本地副本,即使我从另一个线程的另一个线程本地对象访问它。这是预期的行为吗?因为除非我将指针或引用传递给要读取的外部线程本地对象,否则无法使用“引用者”从另一个线程获取信息。
对于“referer”,我指的是管理或可以让您从其线程访问其自己的 thread_local 变量的东西。但那是不可能的!!任何产生 thread_local 变量的表达式,无论来自谁(我做过不同的测试,即使使用访问器函数),都以使用读取线程的 thread_local 实例结束。
【问题讨论】:
-
我不确定使用
thread_local在线程之间进行通信是否符合thread_local存储的精神。为什么不直接使用普通的static? -
我只是....“理解行为”(或试图)。
-
嗯,它是一个语法问题。仅仅因为您使用的语法看起来像是在取消引用
A指针,所以您不是。编译器看到它是static并忽略指针并直接进入单个(在这种情况下为每个线程)静态实例。整个thread_local业务实际上与此无关。 -
使 i 成为常规的非静态和非 thread_local 成员。然后你的 lambda 将引用 main 中创建的 A 实例中的 i。
标签: c++ multithreading c++11 thread-local