4

すべてのコンパイラには独自のバージョンのスレッド ローカル ストレージがあるため、最終的にはそのためのマクロを作成しました。唯一の問題は、GCC (pthreads がオフになっている) であり、次のようになります。

「このターゲットではスレッドローカルストレージはサポートされていません」

この場合、pthreads が実際にオフになっていることを考えると、それで十分です。問題は、 #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上にあります。ポータブルかどうかはわかりません...

4

2 に答える 2

6

コンパイルコマンドラインに含まれている-lpthreadかどうか:そこにも a を含めることができます-DHAVE_PTHREADS

本当に GCC/ELF 固有のランタイム検出が必要な場合は、弱い参照に頼ることができます。

#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
于 2010-11-01T18:34:01.710 に答える
1

プロジェクトで autoconf を使用している場合、ax_tls.m4が役立つことがあります。

于 2010-11-01T18:06:22.650 に答える