免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5253 | 回复: 17
打印 上一主题 下一主题

哪位知道如何让linux支持NPTL [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-16 16:43 |只看该作者 |倒序浏览
安装linux发行版fedora4, 发现虽然内核是2.6 但我编写多线程程序, 使用线程库还是历史幽久的linuxthreads,而不是新的NPTL. 请问要如何做才能让我的gcc使用新的库.

内核和gcc信息如下:

[root@localhost linux-2.6.15.7]# gcc -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.0 20060304 (Red Hat 4.1.0-3)
[root@localhost linux-2.6.15.7]# uname -a
Linux localhost.localdomain 2.6.15-1.2054_FC5smp #1 SMP Tue Mar 14 16:05:46 EST 2006 i686 i686 i386 GNU/Linux

[ 本帖最后由 yulc 于 2006-5-16 16:44 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-16 18:24 |只看该作者
fc4早就是nptl了,你用getconf GNU_LIBPTHREAD_VERSION查看一下输出

论坛徽章:
0
3 [报告]
发表于 2006-05-16 22:38 |只看该作者
nptl的支持是在glibc中的,与gcc无关,升级你的glibc到2.4版吧。

论坛徽章:
0
4 [报告]
发表于 2006-05-17 10:02 |只看该作者
谢谢两位版主的答复.
我的机器相关情况如下:

[root@localhost gcc]# getconf GNU_LIBPTHREAD_VERSION
NPTL 2.4
[root@localhost gcc]# ll /lib/libc-2.4.so
-rwxr-xr-x 1 root root 1528292 Mar  8 06:22 /lib/libc-2.4.so

即是NPTL和glibc2.4, 如果我没理解错的话.
根据我对现有线程库的理解,我认为如果使用linuxpthreads库的话,那么在多线程程序中,会产生一个用户线程来维护当前的线程,例如在main()中创建了2个线程,那么用 ps axm 查看进程表,程序应有
4个线程, 即传统的N:1模式,这点版主比我要理解得深得多.呵呵.
http://bbs.chinaunix.net/viewthr ... &extra=page%3D2

而使用NPTL创建2个线程, 那么总数应该只有3个线程才对.
可是我的程序却依然有4个线程,所以我(误)以为依然使用的是linuxthreads方式.

不知对否?

论坛徽章:
0
5 [报告]
发表于 2006-05-17 10:10 |只看该作者
ps:
我在每个线程内部调用 getpid()时,都是返回相同的pid,这明显是linuxthreads的工作模式,而NPTL应该是线程ID唯一才对吧.

论坛徽章:
0
6 [报告]
发表于 2006-05-17 10:31 |只看该作者
原帖由 yulc 于 2006-5-17 10:10 发表
ps:
我在每个线程内部调用 getpid()时,都是返回相同的pid,这明显是linuxthreads的工作模式,而NPTL应该是线程ID唯一才对吧.

getpid 返回的是进程号,当然是相同的。

论坛徽章:
0
7 [报告]
发表于 2006-05-17 12:02 |只看该作者

回复 4楼 yulc 的帖子

ps看不到线程的, 用pstree命令才能看到

论坛徽章:
0
8 [报告]
发表于 2006-05-17 13:08 |只看该作者
ps -m 可以显示进程中的线程的

另外, albcamus兄,可否告诉我我的理解是否正确?

根据我对现有线程库的理解,我认为如果使用linuxpthreads库的话,那么在多线程程序中,会产生一个用户线程来维护当前的线程,例如在main()中创建了2个线程,那么用 ps axm 查看进程表,程序应有
4个线程, 即传统的N:1模式,这点版主比我要理解得深得多.呵呵.
http://bbs.chinaunix.net/viewthr ... &extra=page%3D2

而使用NPTL创建2个线程, 那么总数应该只有3个线程才对.
可是我的程序却依然有4个线程,所以我(误)以为依然使用的是linuxthreads方式.

论坛徽章:
0
9 [报告]
发表于 2006-05-17 13:29 |只看该作者

回复 8楼 yulc 的帖子

我试了下创建10个线程, ps amx显示的多2个, pstree显示的则正好。 原因不明白。

另外,linux下一个命名混乱的例子就是, 大家还用LinuxThreads这个词来指NPTL,导致有时侯根本分不清楚是什么。

论坛徽章:
0
10 [报告]
发表于 2006-05-17 13:44 |只看该作者
原帖由 albcamus 于 2006-5-17 13:29 发表
我试了下创建10个线程, ps amx显示的多2个, pstree显示的则正好。 原因不明白。

另外,linux下一个命名混乱的例子就是, 大家还用LinuxThreads这个词来指NPTL,导致有时侯根本分不清楚是什么。


创建10个线程(在main()函数中调用10次pthread_create()的话),
那么用ps axm 显示应该是12个,
其中10个代表达式这10个pthread_create()创建的线程;
1个代表main()这个主线程;
1个代表守护线程,即由glibc创建用来管理和维护这10个线程的线程.这个线程只有你调用了pthread_create()函数就会存在.
pstree 则帮你分析了这个进程及子进程树,他只是显示10个,表示有10个线程.
这点我想是这样理解的,版主应该没啥异意吧.

其实我主要是想证明我的系统使用的是NPTL而非linuxthreads, 根据网络上千篇一律的描述,前者是1:1的模型,即一个用户线程对应一个内核线程,后者是N:1的模型,需要用户态创建一个管理线程来对线程进行管理.
我的问题就是在这,明明用的就是linuxthreads,即N:1的模型呀.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP