Après avoir déclaré une variable de cette manière:
#include <thread>
namespace thread_space
{
thread_local int s;
} //etc.
j'ai essayé de compiler mon code en utilisant 'g ++ -std = c ++ 0x -pthread [fichier source]'. Je reçois l'erreur suivante:
example.C:6:8: error: thread-local storage is unsupported for the current target
static thread_local int s;
^
1 error generated.
Si j'essaie de compiler le même code sous Linux avec GCC 4.8.1 avec les mêmes drapeaux, j'obtiens un fichier exécutable fonctionnel. J'utilise clang-503.0.40 (celui fourni avec Xcode 5.1.1) sur un MacBook Pro sous OSX 10.9.3. Quelqu'un peut-il m'expliquer ce que je fais mal? Je vous remercie!!
Essayez clang++ -stdlib=libc++ -std=c++11
. La bibliothèque obsolète libstdc ++ d’OS X ne prend pas en charge TLS.
Modifier
Ok, cela fonctionne pour la version normale mais pas pour la version Xcode.
Je ai fait un diff contre clang d'Apple (503.0.38) et le normale publié un et a trouvé la différence suivante:
.Case("cxx_thread_local",
- LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported() &&
- !PP.getTargetInfo().getTriple().isOSDarwin())
+ LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported())
Donc, je pense que c'est un bogue dans la version clang d'Apple (ou qu'ils l'ont gardé exprès - mais toujours bizarre, parce que -v
dit basé sur 3.4).
Vous pouvez également utiliser des extensions de compilateur telles que __thread
(GCC/Clang) ou __declspec(thread)
(Visual Studio).
Enveloppez-le dans une macro et vous pourrez facilement transférer votre code sur différents compilateurs et versions linguistiques:
#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;
Le compilateur Clang inclus dans les versions bêta de Xcode 8 et GM prend en charge le mot clé C++ 11 thread_local
avec -std=c++11
et -std=c++14
(ainsi que les variantes de GCC).
Les versions antérieures de Xcode prenaient apparemment en charge le stockage local des threads de style C en utilisant les mots clés __thread
ou _Thread_local
, selon la vidéo WWDC 2016 "What's New in LLVM" (voir la discussion commençant à 5:50).
On dirait que vous devrez peut-être définir la version minimale d’OS X que vous ciblez à 10.7 ou plus.