我有一个程序,对于linuxthreads和nptl必须有不同的工作方式。
这个库中是否有定义,可以在我的程序中使用来检测,是使用nptl还是linuxthreads?
UPDATE1:对于运行时,有一个getconf GLIBC_LIBPTHREADS,但编译时是什么?
答案 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)上运行的多线程应用程序中没有遇到任何需要。 ))