2010-11-01 61 views
4

因为每个编译器都有自己的线程本地存储版本,所以我最终为它创建了一个宏。现在唯一的问题是GCC(与并行线程关闭),这给了我:因为并行线程实际上在这种情况下关闭“不支持此目标线程本地存储”“此目标不支持线程本地存储”,适合#ifdef?

不够公平

。问题是,是否有一种使用一些宏来检测这种情况的通用方法,例如, #ifdef __GCC_XXX_NO_THREADS_XXX?

编辑:请参阅下面的接受答案。另外,这里是我的懒惰的解决方案:


$ touch test.c 
$ gcc -E -dM test.c > out.1 
$ gcc -pthread -E -dM test.c > out.2 
$ diff out.* 
28a29 
> #define _REENTRANT 1 

这是在Mac OS X我不知道这是否是便携式的,或者什么...

回答

6

你的编译命令行或者具有-lpthread与否:你可以包括-DHAVE_PTHREADS那里。

如果你真的想GCC/ELF特定的运行dectection,你可以求助于弱裁判:

#include <pthread.h> 

extern void *pthread_getspecific(pthread_key_t key) __attribute__ ((weak)); 

int 
main() 
{ 
    if (pthread_getspecific) 
     printf("have pthreads\n"); 
    else 
     printf("no pthreads\n"); 
} 

这里是什么样子:

$ gcc -o x x.c 
$ ./x 
no pthreads 
$ gcc -o x x.c -lpthread 
$ ./x 
have pthreads 
+0

谢谢你提醒我__attribute __(弱)。是的,显然你是对的,我可以使用宏。我的问题更多的是懒惰的:),但也因为我很好奇答案。 – Krumelur 2010-11-01 18:44:38

1

如果您使用autoconf你的项目,你可能会发现ax_tls.m4有用。

+0

但我不(幸运的): )。为了记录,我使用cmake,但如果可能的话,我宁愿将它直接放在头文件中,因为我现在只是一起篡改一个小原型... – Krumelur 2010-11-01 18:13:08

+0

grep/usr/include表明__GTHREADS在内部使用在许多头文件中,但看起来相当不可靠,并且不打算供公众使用。 – Flexo 2010-11-01 18:31:24

+0

只是为了它,我在Ubuntu机器上尝试了我的差异。得到相同的结果(即_REENTRANT)。读取头文件时,如果__GTHREADS与gcc编译时是否使用线程支持相关,则看起来更像。但我不知道......我应该回到我正在做的事情:) – Krumelur 2010-11-01 18:54:24