我这样声明了一个变量之后:
#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或更高。