2010-11-01 41 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