локалното хранилище на нишка не се поддържа за тази цел, подходящо #ifdef?

Тъй като всеки компилатор има своя собствена версия на локално хранилище на нишки, в крайна сметка създадох макрос за него. Единственият проблем сега е 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. Не съм сигурен дали е преносим или нещо подобно...


person Krumelur    schedule 01.11.2010    source източник


Отговори (2)


Вашият команден ред за компилиране или има -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
person Ben Jackson    schedule 01.11.2010
comment
Благодаря, че ми напомни за __attribute__(слаб). И да, очевидно си прав, че мога да използвам макрос. Въпросът ми е по-скоро от мързелив вид :), но и защото ми е любопитно за отговора. - person Krumelur; 01.11.2010

Ако използвате autoconf за вашия проект, може да намерите ax_tls.m4 полезен.

person Flexo    schedule 01.11.2010
comment
Но аз не (за щастие) :). За протокола използвам cmake, но бих предпочел да го имам направо в заглавния файл, ако е възможно, тъй като в момента просто хаквам малък прототип... - person Krumelur; 01.11.2010
comment
grep /usr/include предполага, че __GTHREADS се използва вътрешно в редица заглавни файлове, но това изглежда доста ненадеждно и не е предназначено за обществена употреба. - person Flexo; 01.11.2010
comment
Просто за доброто на това, аз опитах моя diff нещо на Ubuntu машина. Даде същия резултат (т.е. _REENTRANT). Четейки заглавката, изглежда повече дали __GTHREADS има общо с това дали gcc е компилиран с поддръжка на нишки или не. Но не знам... вероятно трябва да се върна към това, което правех вместо това :) - person Krumelur; 01.11.2010