【发布时间】:2018-01-29 10:24:26
【问题描述】:
C++11 有关键字thread_local。我想知道这个关键字是否只适用于使用标准库(std::thread)创建的线程,或者它保证可以与其他线程库一起使用,例如Windows CreateThread 函数或 Unix pthread。
Microsoft documentation for visual studio 声明:
线程扩展存储类修饰符用于声明线程局部变量。对于 C++11 及更高版本中的可移植等效项,请将 thread_local 存储类说明符用于可移植代码。在 Windows 上,thread_local 使用 __declspec(thread) 实现。
因此 thread_local 在 MS Visual Studio 中按预期工作。我仍然想知道其他编译器和平台的情况是否如此。
【问题讨论】:
-
最有可能依赖于实现。
-
这可能是UB。但它真的有效吗?可能,只要库使用内核线程。但你不应该依赖其中任何一个。
-
@freakish:我不会这么认为。例如,
std::threadctor 可能会在内核线程中初始化线程本地存储。它适用于 Windows,因为内核线程有TlsGetValue/TlsSetValue。
标签: c++ multithreading