msgstr "локальное хранилище потока не поддерживается для этой цели", подходит #ifdef? - PullRequest
4 голосов
/ 01 ноября 2010

Поскольку у каждого компилятора есть своя версия локального хранилища потоков, я создал для него макрос. Единственная проблема сейчас - это 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. Я не уверен, что это портативный или что-то еще ...

Ответы [ 2 ]

6 голосов
/ 01 ноября 2010

В вашей командной строке компиляции либо -lpthread, либо нет: вы также можете включить -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
1 голос
/ 01 ноября 2010

Если вы используете autoconf для своего проекта, вы можете найти ax_tls.m4 полезным.

...