C11 引入了_Thread_local
存储类说明符,该说明符可以与static
和extern
存储类说明符结合使用,以将变量声明为线程本地的。__thread
GNU C 编译器套件实现了具有相同语义的存储类说明符。
不幸的是,我没有找到任何真正实现_Thread_local
关键字的编译器(我尝试过 gcc、clang 和 SUN studio)。我目前使用以下构造来声明关键字thread_local
:
/* gcc doesn't know _Thread_local from C11 yet */
#ifdef __GNUC__
# define thread_local __thread
#elif __STDC_VERSION__ >= 201112L
# define thread_local _Thread_local
#else
# error Don't know how to define thread_local
#endif
我知道这可能不适用于 MSVC 和其他编译器。任何人都可以建议我一种更好的方法来声明thread_local
它可以在尽可能多的编译器中工作吗?
编辑
Christoph建议 Microsoft Visual C 允许__declspec(thread)
. 这是更新的宏定义:
/* gcc doesn't know _Thread_local from C11 yet */
#ifdef __GNUC__
# define thread_local __thread
#elif __STDC_VERSION__ >= 201112L
# define thread_local _Thread_local
#elif defined(_MSC_VER)
# define thread_local __declspec(thread)
#else
# error Cannot define thread_local
#endif