【发布时间】:2011-11-05 23:02:03
【问题描述】:
AFAIK g++ 和 cl 都支持编译器特定的 TL 存储......所以我想知道 C++11 TLS 与他们现在支持的不同吗?
线程本地存储 (TLS) 是一种方法,用于将线程中的每个线程 给定的多线程进程可以分配存储位置 线程特定的数据。动态绑定(运行时)线程特定 通过 TLS API([TlsAlloc]、[TlsGetValue]、 [TlsSetValue] 和 [TlsFree])。 Win32 和 Visual C++ 编译器现在 除了支持静态绑定(加载时)每线程数据 现有的 API 实现。
对于 VS 11 的支持也被列为部分支持。 对于 g++,它甚至不在 GCC4.7 中
【问题讨论】:
-
嗯,MS 术语中的 "partial" 支持意味着,"我们有一个类似的功能,只是它不是 C++11 的功能,而是完全使用不同的语法和结果会产生相同的平台相关代码,您可以在 C++11" 之前编写多年,因此可以简单地转换为 "no"。
-
鉴于截至 2013 年 4 月只有 GCC 4.8 支持此功能,这可能并不容易。事实上,只有 GCC 4.8 支持
thread_local的构造和销毁语义。如果您想在 GCC 4.7(或更早版本)中使用__thread或在 MSVC 中使用__declspec(thread)定义 C++ 对象(具有构造函数或析构函数),编译器会报错。 Clang 可以很好地编译我用__thread标记的对象,但它不会为每个新线程创建对象。
标签: c++ compiler-construction c++11 thread-local