C ++ thread_local与std :: thread的线程库不同

时间:2018-01-29 10:24:27

标签: c++ multithreading

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中按预期工作。我仍然想知道其他编译器和平台的情况是否属实。

1 个答案:

答案 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创建还是由某种实现定义的方式创建。我不希望理智的托管实现在其他方面表现出来。