【发布时间】:2013-08-18 10:49:20
【问题描述】:
C11 引入了_Thread_local 存储类说明符,它可以与static 和extern 存储类说明符结合使用,以将变量声明为线程本地的。 GNU C 编译器套件实现了具有相同语义的存储类说明符 __thread。
不幸的是,我没有找到任何真正实现 _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
【问题讨论】:
-
在 MSVC 中,写成
__declspec( thread )(见msdn.microsoft.com/en-us/library/4ax54352.aspx) -
@KingsIndian Jupp。这就是为什么我问定义这个宏的最佳方法是什么。
-
@KingsIndian Generic 可能包含一些愚蠢编译器的特殊情况。
标签: c gcc portability c11 thread-local-storage