c++线程本地存储clang-503.0.40 (Mac OSX)



我这样声明了一个变量之后:

   #include <thread>
   namespace thread_space
    {
    thread_local int s;
    } //etc.

我试着用' c++ -std=c++0x -pthread [sourcefile]'来编译我的代码。我得到以下错误:

example.C:6:8: error: thread-local storage is unsupported for the current target
static thread_local int s;
       ^
1 error generated.

如果我尝试用GCC 4.8.1在Linux上编译相同的代码,带有相同的标志,我得到一个功能正常的可执行文件。我在运行OSX 10.9.3的MacBook Pro上使用clang-503.0.40 (Xcode 5.1.1附带的那个)。有人能告诉我我哪里做错了吗?谢谢你! !

尝试clang++ -stdlib=libc++ -std=c++11。OS X过时的libstdc++不支持TLS。

编辑

好的,这适用于正常的clang版本,但不适用于Xcode版本。

我对苹果的clang(503.0.38)和正常发布的clang进行了比较,发现以下差异:

        .Case("cxx_thread_local",
-                 LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported() &&
-                 !PP.getTargetInfo().getTriple().isOSDarwin())
+                 LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported())

所以我认为这是苹果clang版本的一个bug(或者他们故意把它留在那里——但仍然很奇怪,因为-v说基于3.4)

或者,您可以使用__thread (GCC/Clang)或__declspec(thread) (Visual Studio)等编译器扩展。

将其封装在宏中,您可以轻松地将代码移植到不同的编译器和语言版本:

#if HAS_CXX11_THREAD_LOCAL
    #define ATTRIBUTE_TLS thread_local
#elif defined (__GNUC__)
    #define ATTRIBUTE_TLS __thread
#elif defined (_MSC_VER)
    #define ATTRIBUTE_TLS __declspec(thread)
#else // !C++11 && !__GNUC__ && !_MSC_VER
    #error "Define a thread local storage qualifier for your compiler/platform!"
#endif
...
ATTRIBUTE_TLS static unsigned int tls_int;

Xcode 8 Beta和GM版本中包含的clang编译器支持c++ 11 thread_local关键字与-std=c++11-std=c++14(以及GCC变体)。

早期版本的Xcode显然支持使用关键字__thread_Thread_local的c风格线程本地存储,根据WWDC 2016视频"LLVM的新功能"(见讨论开始在5:50)。

似乎你可能需要将你的目标OS X最低版本设置为10.7或更高。