この方法で変数を宣言した後:
#include <thread>
namespace thread_space
{
thread_local int s;
} //etc.
'g ++ -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.
LinuxでGCC4.8.1を使用して同じフラグを使用して同じコードをコンパイルしようとすると、機能する実行可能ファイルが取得されます。 OSX10.9.3を実行しているMacBookProでclang-503.0.40(Xcode 5.1.1に付属しているもの)を使用しています。誰かが私が間違っていることを私に説明できますか?ありがとうございました!!
clang++ -stdlib=libc++ -std=c++11
をお試しください。 OSXの古いlibstdc ++はTLSをサポートしていません。
編集
わかりました。これは通常のclangバージョンでは機能しますが、Xcodeバージョンでは機能しません。
Appleのclang(503.0.38) と 通常リリースされたもの に対して差分をとったところ、次の違いが見つかりました。
.Case("cxx_thread_local",
- LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported() &&
- !PP.getTargetInfo().getTriple().isOSDarwin())
+ LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported())
したがって、これはAppleのclangバージョンのバグだと思います(または、意図的にそこに保持していましたが、-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;
_
Xcode8ベータ版およびGMリリースに含まれるclangコンパイラーは、thread_local
および-std=c++11
の両方でC++ 11 -std=c++14
キーワードをサポートします(およびGCCバリアント)。
Xcodeの以前のバージョンは、キーワード__thread
または_Thread_local
を使用してCスタイルのスレッドローカルストレージをサポートしていたようです。 WWDC 2016ビデオ「LLVMの新機能」 (説明を参照) 5:50から)。
ターゲットとするOSXの最小バージョンを10.7以上に設定する必要があるようです。