我有一个程序,它必须为linuxthread和nptl不同的工作。
在这个库中有没有定义,可以在我的程序中用来检测是否使用了nptl或linuxthread?
UPDATE1:对于运行时有一个getconf GLIBC_LIBPTHREADS,但是对于编译时呢?
发布于 2010-11-12 04:41:36
看起来这是不可能的,你可以在加载时改变实现,所以无论你做什么,在编译时都无法知道。
在pthread手册页中:
在具有同时支持LinuxThreads和NPTL的glibc (即glibc 2.3.x)的系统上,LD_ASSUME_KERNEL环境变量可用于覆盖动态链接器的默认线程实现选择。这个变量告诉动态链接器假设它运行在特定的内核版本之上。通过指定一个不提供NPTL所需支持的内核版本,我们可以强制使用LinuxThreads。(这样做的最可能的原因是运行一个(损坏的)应用程序,该应用程序依赖于LinuxThreads中的一些不符合规范的行为。)例如:
bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so |\ awk '{print $3}‘)| egrep -i’线程|ntpl‘linuxthreads 0.10 by Xavier Leroy
更不用说这两个实现(大部分)是二进制兼容的,所以基本上你不能在编译时知道将使用哪个线程库,因为它可能会根据程序运行时出现的环境变量而变化,或者有人可能会将二进制文件从NPTL系统复制到LinuxThreads系统。你就是不能这么做,因为它在编译时是未知的,至少不是你可以依赖的方式。
你必须找到一些方法来使用运行时检测,或者你可以更新你的帖子,告诉你为什么要这样做,也许有人可以提供一些建议,告诉你如何以其他方式实现它,或者如何使用运行时检测正在使用哪些pthread。
另一种可能的解决方案是向您的配置脚本添加一个选项,并让编译它的人员选择。
https://stackoverflow.com/questions/3512396
复制相似问题