检查__thread关键字是否可用

时间:2014-09-06 22:04:17

标签: c multithreading keyword

我找不到任何可以告诉我__thread关键字/功能是否存在的功能/宏。

例如,我想在没有用户定义HAS_TLS

的情况下执行此类操作
#if HAS_TLS
    static __thread int mytlsdata;
#else
    static pthread_key_t mytlskey;
#endif

2 个答案:

答案 0 :(得分:5)

唯一接近预定义标准的事情是,

#if __STDC_VERSION__ >= 201112L && !defined __STDC_NO_THREADS__
    static _Thread_local int mytlsdata;
#endif

但是这没有检测到等效的前C11特征,例如你的__thread。假设__STDC_VERSION__准确地反映了编译器的真正能力,这在历史上是不明智的。

此时我通常会推荐Autoconf,但它似乎没有现成的测试来检测这些,如果您以前从未对Autoconf做过任何事情,这可能不是开始的地方。对不起,我无法提供更多帮助。

答案 1 :(得分:2)

使用关键字的TLS支持是特定于编译器的。 LLVM / clang使用__thread,而VisualC ++使用__declspec(thread),C ++ Builder支持__thread__declspec(thread)等。没有预编译器宏来确定是否可以使用TLS关键字,或者它们实际上是什么关键字。要编写TLS的跨平台代码,您必须相应地检测特定的编译器和代码。