是否有linuxthreads和nptl的特定定义

时间:2010-08-18 13:09:10

标签: c++ c nptl predefined-macro linuxthreads

我有一个程序,对于linuxthreads和nptl必须有不同的工作方式。

这个库中是否有定义,可以在我的程序中使用来检测,是使用nptl还是linuxthreads?

UPDATE1:对于运行时,有一个getconf GLIBC_LIBPTHREADS,但编译时是什么?

3 个答案:

答案 0 :(得分:4)

看起来不可能,你可以在加载时更改实现,这样无论你做什么都无法在编译时知道。

来自pthreads手册页:

  

在支持glibc的系统上   LinuxThreads和NPTL(即   glibc 2.3.x),LD_ASSUME_KERNEL   环境变量可以用来   覆盖动态链接器的默认值   线程实现的选择。   该变量告诉动态链接器   假设它在运行之上   特定的内核版本。通过   指定一个内核版本   不提供所需的支持   NPTL,我们可以强制使用   Linux线程。 (最可能的原因   这样做是为了运行(破碎)   应用程序取决于一些   不一致的行为   LinuxThreads。)例如:

bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \
                awk '{print $3}' ) | egrep -i 'threads|ntpl'
linuxthreads-0.10 by Xavier Leroy

更不用说两个实现(大部分)是二进制兼容的,所以基本上你不能在编译时知道将使用哪个线程库,因为它可能会根据程序运行时出现的环境变量而改变,或者有人可以将二进制文件从NPTL系统复制到LinuxThreads系统。你不能这样做,因为它不是在编译时已知的东西,至少不是你可以依赖的方式。

您必须找到一些方法来使用运行时检测,或者您可以使用有关为什么要执行此操作的信息更新您的帖子,并且有人可能会提供有关如何以其他方式完成此操作的建议,或者如何使用运行时检测可以使用哪个pthreads。

另一种可能的解决方案是在配置脚本中添加一个选项,并让编辑它的人选择。

答案 1 :(得分:1)

让我们退后一步问 - 你为什么要这样做?

是否有人提供的功能而另一个没有?如果是这样,也许您可​​以在libpthread.so上使用dlsym在运行时动态查询它们的存在。

或者更多的是它们之间的某些行为不同,导致您的程序行为不端?如果是这样,我会避免依赖这些行为的结果,或者参考像POSIX这样的标准来确定你能够依赖的东西。通常这样的可移植性错误代表了代码中的真正缺陷,即使使用您认为正在“工作”的库,也可能需要解决。当并发进入图片时,这对于正确而言尤其重要。

最后,如果这是结构大小的问题......也可能有一些黑客的方法。例如(只是一个例子,可能完全偏离基础,但说明了这个想法):

// Hack around difference in pthread_mutex_t
//
#define pthread_mutex_t pthread_mutex_t_linuxthreads
#include <some_linuxthreads_header.h>
#undef pthread_mutex_t
#define pthread_mutex_t pthread_mutex_t_ntpl
#include <some_ntpl_header.h>
#undef pthread_mutex_t

typedef union {
    pthread_mutex_t_linxthreads linuxthreads;
    pthread_mutex_t_ntpl ntpl;
} pthread_mutex_t;

非常hacky和非常丑陋,但只是把这些想法作为一种可能的解决方法......

答案 2 :(得分:1)

查看标题后,没有 - 没有针对NPTL与LinuxThreads的具体定义。

如果需要这样的定义,请编写一个生成头文件的小脚本,或者将一个define标志传递给编译器。您可以通过解析/lib/libc.so.6的输出来获取信息(该库可以作为普通可执行文件直接运行)。我将把详细信息留给您,但输出如下:

的LinuxThreads:

GNU C Library stable release version 2.3.4, by Roland McGrath et al.
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 3.4.6 20060404 (Red Hat 3.4.6-11).
Compiled on a Linux 2.4.20 system on 2010-04-18.
Available extensions:
        GNU libio by Per Bothner
        crypt add-on version 2.1 by Michael Glad and others
        linuxthreads-0.10 by Xavier Leroy
        The C stubs add-on version 2.1.2.
        BIND-8.2.3-T5B
        NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
        Glibc-2.0 compatibility add-on by Cristian Gafton
        GNU Libidn by Simon Josefsson
        libthread_db work sponsored by Alpha Processor Inc
Thread-local storage support included.
For bug reporting instructions, please see:
.

NPTL:

GNU C Library stable release version 2.5, by Roland McGrath et al.
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-48).
Compiled on a Linux 2.6.9 system on 2010-10-25.
Available extensions:
        The C stubs add-on version 2.1.2.
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        GNU libio by Per Bothner
        NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
        Native POSIX Threads Library by Ulrich Drepper et al
        BIND-8.2.3-T5B
        RT using linux kernel aio
Thread-local storage support included.
For bug reporting instructions, please see:
.

(但是,尝试更好地编写不需要处理此问题的代码。到目前为止,我们在RHEL 4(linuxthreads)和RHEL 5(NPTL)上运行的多线程应用程序中没有遇到任何需要。 ))