我正在尝试编写一些库代码,这些代码可能被启用(或未启用)pthread的人以及(或未启用)openmp支持的人使用。我有一些我真正想要在线程本地存储中的变量。两次指定是否有潜在的危害,例如
#ifdef __GNUC__
# define PREFIX __thread
#elif __STDC_VERSION__ >= 201112L
# define PREFIX _Thread_local
#elif defined(_MSC_VER)
# define PREFIX __declspec(thread)
#else
# define PREFIX
#endif
PREFIX int var = 10;
#pragma omp threadprivate(var)
(请注意,确定TLS前缀的业务来自How to declare a variable as thread local portably?)
我知道这可以在我的系统上运行(带有最近gcc的Debian),但是很难知道其他地方是否会出错,因为这些特定于编译器的声明不是OpenMP标准的一部分。
最佳答案
关于什么:
#if __STDC_VERSION__ >= 201112L
# define PREFIX _Thread_local
#elif defined(__GNUC__)
# define PREFIX __thread
#elif defined(_MSC_VER)
# define PREFIX __declspec(thread)
#else
# define PREFIX
#endif
PREFIX int var = 10;
#if !PREFIX
#ifdef _OPENMP
#pragma omp threadprivate(var)
#else
#error "Failure to put variable into TLS"
#endif
#endif
GCC不介意过度指定,因为
__thread
还是隐式的#pragma omp threadprivate
。不必担心可能不是这种情况的编译器,只需有条件地使用OpenMP的
threadprivate
。关于c - 冗余__thread和omp threadlocal声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38035067/