【问题标题】:"thread-local storage not supported for this target", suitable #ifdef?“此目标不支持线程本地存储”,合适的#ifdef?
【发布时间】:2011-05-03 13:39:00
【问题描述】:

由于每个编译器都有自己的线程本地存储版本,我最终为它创建了一个宏。现在唯一的问题是 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 上的。我不确定它是便携的还是其他的......

【问题讨论】:

    标签: c++ gcc portability thread-local


    【解决方案1】:

    你的编译命令行要么有-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
    

    【讨论】:

    • 感谢您提醒我有关 __attribute__(weak) 的信息。是的,显然你是对的,我可以使用宏。我的问题更多是懒惰的:),但也因为我对答案很好奇。
    【解决方案2】:

    如果您在项目中使用 autoconf,您可能会发现 ax_tls.m4 很有用。

    【讨论】:

    • 但我没有(幸运的是):)。作为记录,我使用 cmake,但如果可能的话,我更愿意将它直接放在头文件中,因为我现在只是在拼凑一个小原型......
    • grep /usr/include 暗示 __GTHREADS 在许多头文件内部使用,但这看起来很不可靠,不适合公共使用。
    • 只是为了它,我在 Ubuntu 机器上尝试了我的差异。给出了相同的结果(即_REENTRANT)。阅读标题,如果 __GTHREADS 与 gcc 是否在线程支持下编译有关,它看起来更像。但我不知道......我可能应该回到我正在做的事情:)
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多