LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 801|回复: 9

RH8下多线程程序到RH9下就常死机,不知道是不是内核的原因?

[复制链接]
发表于 2004-8-20 11:03:41 | 显示全部楼层 |阅读模式
在redhat8下编程的多线程程序,运行几个月都没有死机,效率也很好。

可放到redhat9下编译后,再运行,个把小时就死机了。

是不是2.4.18和2.4.20的内核的变化造成的?还是编译器的原因?(使用的系统自带的,没有下载最新的。)

望碰到类似情况的同志说说感受啊!
发表于 2004-8-21 09:33:57 | 显示全部楼层
如果怀疑是内核造成的问题,那就把redhat8的内核拿到redhat9下去启动看看。
我觉得动态库的变化可能也有影响。自己最好调试一下程序,看看问题出在那里。
 楼主| 发表于 2004-8-21 18:00:18 | 显示全部楼层
谢谢,我自己再试试看
发表于 2004-8-22 01:04:55 | 显示全部楼层
可能是RH9里包含的Native POSIX Thread Library (NPTL)和你程序不大兼容。
在程序中设定环境变量

export LD_ASSUME_KERNEL=2.4.1

再试试。。。

PS:很多程序在红帽RH9以上版本都会遇到问题,原因大都是上面的问题。解决方法也同上。本人纯属类推,不对请见谅。
 楼主| 发表于 2004-8-23 09:00:58 | 显示全部楼层
谢谢,我来试试!!
真是好人。
 楼主| 发表于 2004-8-23 09:19:03 | 显示全部楼层
谢谢,试了,是这个问题。是和NPTL有冲突。
用原来的线程库可以运行了,效果还行。

好。我过几天就再努力移植到NPTL线程库下。
 楼主| 发表于 2004-8-24 09:07:23 | 显示全部楼层
再问一下:是不是在RH9下编写配合NPTL的多线程程序,glibc也要升级了才行?而内核不用升级,还是采用2.4.20的就行?
即:(1)2.4.20(RH9)+glibc(至少2.3.3)+gcc(较新或RH9自带)+make,是这样的组合吗?
还是:(2)2.4.20(RH9)+glibc(RH9)+gcc(RH9)+make?
还是:(3)2.6.x(Rh9下编译或Mandrake10或FedoraCore2)+glibc(至少2.3.3)+gcc(较新或RH9)+make?
 楼主| 发表于 2004-8-24 09:29:31 | 显示全部楼层
还问一个:如果我原来的程序都遵守POSIX标准,是不是只要拿新的glibc重新编译就可以了?没有太大的修改工作?
发表于 2004-8-24 18:21:25 | 显示全部楼层
[PHP]红帽企业 Linux AS 3 发行注记
Copyright © 2003 Red Hat, Inc.





红帽企业 Linux 3 包括 Native POSIX Thread Library (NPTL),它是 Linux 的 POSIX 线程的新实现。该库提高了性能并增加了可缩放性。

该线程库被设计成与原有的 LinuxThreads 实现在二进制上兼容;不过,依赖于脱离 POSIX 标准的 LinuxThreads 实现之处的应用程序将需要被修正。值得注意的不同之处包括:

· 信号处理已从每线程信号处理改成 POSIX 进程信号处理。

· getpid() 在所有的线程中返回相同值。

· 如果使用了 vfork(),用 pthread_atfork 注册的线程处理程序就不会运行。

· 无管理线程。

使用 NPTL 时会遇到问题的已知应用程序包括:

- 版本 1.4.1 之前的 Sun JRE

- IBM JRE

如果某应用程序使用 NPTL 无法正确运行,它可以使用原有的 LinuxThreads 实现来运行,方法是设置以下的环境变量:

LD_ASSUME_KERNEL=<kernel-version>

可用的版本如下:

· 2.4.19 — 带有浮动堆栈的 Linuxthreads

· 2.4.19 — 没有浮动堆栈的 Linuxthreads

注意,使用 errno、h_errno、和 _res 的软件在它们被使用前必须包含(#include)恰当的头文件(依次为 errno.h、netdb.h、和 resolv.h)。不过,在软件被修正之前,您可以把 LD_ASSUME_KERNEL=2.4.19 用作绕行措施。

使用线程取消的多线程 C++ 程序可能需要通过 LD_ASSUME_KERNEL=2.4.19 这个环境变量设置来强制使用 LinuxThreads 库。否则,如果取消被执行了(既然生成的例外没有被捕获),程序就会异常终止。

新编写的使用 C 运行时间环境的 C++ 代码可能必须被调整来考虑线程取消因素。这可以通过以下方法之一来进行:

· 不把 C++ 函数标为 throw()(因此调用者就会知道一个例外可能会被投掷),编译带有例外的代码。这是默认的编译选项;用户不应该在编译的时候指定 -fno-exceptions。

· 在进入哪些调用可取消的 C 运行时间函数的函数前完全禁用取消。这可以通过使用以下的调用来做到:

pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate)

调用了 C 函数后,取消可以通过以下调用来重新被启用:

pthread_setcancelstate (oldstate, NULL)

注意:目前,取消会被执行,因此调用 pthread_setcancelstate() 的函数在编译时必须启用例外,而且必须被标为投掷例外。

[/PHP]
 楼主| 发表于 2004-8-25 17:48:47 | 显示全部楼层
翻译版措辞有点生硬。呵呵
这翻译是全部和NPTL相关的内容吗?不会有遗漏吧?

原版在哪里有呢?我想直接看原版
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表