C ++ 11有关键字thread_local。我想知道这个关键字是否只能使用标准库(std :: thread)创建的线程按预期工作,或者保证与其他线程库一起工作,例如Windows CreateThread函数或Unix pthread。
Microsoft documentation for visual studio声明:
线程扩展存储类修饰符用于声明线程局部变量。对于C ++ 11及更高版本中的便携式等效项,请将thread_local存储类说明符用于可移植代码。在Windows上,thread_local是用__declspec(线程)实现的。
因此thread_local在MS Visual Studio中按预期工作。我仍然想知道其他编译器和平台的情况是否属实。
答案 0 :(得分:4)
C ++标准在[intro.multithread]/1:
定义了一个如下的线程执行线程(也称为线程)是单个流程 程序内的控制,包括初始调用a 特定的顶级函数,并递归地包括每个函数 随后由线程执行的调用。 [注意:当一个 线程创建另一个,初始调用顶级函数 新线程由新线程执行,而不是由创建执行 线。 - 结束注释]程序中的每个线程都可以访问 程序中的每个对象和功能。在托管下 实现时,一个C ++程序可以运行多个线程 同时。每个线程的执行按照定义继续执行 本标准的其余部分。执行整个 程序包含所有线程的执行。 [ 注意: 通常,执行可以被视为其所有的交错 线程。但是,某些原子操作允许 如上所述,执行与简单交错不一致 下面。 - 结束语]在独立实施下,它是 实现 - 定义一个程序是否可以有多个线程 执行。
注意上述内容并不仅限于由std::thread
创建的线程。此外,该标准甚至承认存在至少一个执行线程,该线程不一定由std::thread
在[intro.progress]/8创建:
是实现创建的线程是实现定义的 执行执行main和创建的执行线程 由std :: thread提供并发前进保证。 [注意:鼓励通用实施提供 这些保证。 - 结束说明]
此外,虽然以下是注释,并且不能被视为规范,但阅读[thread.threads]/1仍然令人鼓舞:
[thread.threads]描述了可用于创建和的组件 管理线程。 [注意:这些线程旨在一对一地映射 使用操作系统线程。 - 结束注释]
对我而言,所有thread_local
存储都可以在符合上述定义的任何“执行线程”中使用,无论它是由std::thread
创建还是由某种实现定义的方式创建。我不希望理智的托管实现在其他方面表现出来。