笔记本linux退出进程,linux为什么创建线程后主程序退出了

1cd7cdcd8fbec480677116280fd7caa2.png

楼主hzyusijia(田心人土土)

本人现在在作的项目是linux下的用到多线程的 ,粗略的估计一下一共有启动了6个子线程,其中有两个线程是用于接收和发送数据的,当session创建时两个线程要启动,如果当会话终止线程要关闭,但现在不知道为什么,第一次启动关闭是正常的,当第2次启动是好的,但关闭时程序会崩溃,并提示"Couldn't get registers: 没有那个进程."这样的字样.(我在GDB中调试,一般出现错误,使用where可以了解压站的情况,但现在直接崩溃到GDB调试程序外,我根本不知道哪里出错了)

我是用改变线程中的while循环的flag和Thread_join来等待线程结束的(有时在Thread_join前设一个断点程序不会崩溃)

在linux中使用pthread_create创建了一个线程,在终端上会显示[New Thread 1151359552 (LWP 14854)]的消息.

当退出时会现示[Thread 1151359552 (LWP 14854) exited],

但第2次再创建线程时这些消息没有被显示到终端上,而且第2次启动时线程的ID是和前面被结束了的线程的ID

是一样的,这些和程序的崩溃是否有关

是否有哪位高手指点一下,为什么,或者有对关闭应该怎么处理.非常着急,谢谢.

问题点数:50、回复次数:4 Top

1 楼eqxu(天使联盟) 30

1.3 线程创建属性

pthread_create()中的attr参数是一个结构指针,结构中的元素分别对应着新线程的运行属性,主要包括以下几项:

__detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源.缺省为PTHREAD_CREATE_JOINABLE状态.这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态.

__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效.运行时可以用过pthread_setschedparam()来改变.

__schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级.这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0.

__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值.缺省为PTHREAD_EXPLICIT_SCHED.

__scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围.POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU.目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值.

pthread_attr_t结构中还有一些值,但不使用pthread_create()来设置.

为了设置这些属性,POSIX定义了一系列属性设置函数,包括pthread_attr_init()、pthread_attr_destroy()和与各个属性相关的pthread_attr_get---/pthread_attr_set---函数.

建议楼主修改一下属性Top

2 楼hzyusijia(田心人土土) 回复于 2006-06-27 10:38:39 得分 0

哪些属性会和关闭有关呢,?

这边没有将线程分离,是连接的线程,应该可以用JOIN的吧,现在在pthread_join()前设个断点,单步调试是可以的,但没有断点次次都崩溃,真是奇怪呀.Top

3 楼runner001_cn(柳生007) 20

把你的pthread_create的写法贴出来啊

4 楼hzyusijia(田心人土土) 回复于 2006-06-28 13:02:06 得分 0

Thread::Thread( bool bDetach )

m_bDetach = bDetach;

m_bStart = false;

pthread_attr_init( &m_tThreadAttr );

if (m_bDetach)

pthread_attr_setdetachstate( &m_tThreadAttr, PTHREAD_CREATE_DETACHED );

else

pthread_attr_setdetachstate( &m_tThreadAttr, PTHREAD_CREATE_JOINABLE );

void Thread::Start()

if (m_bStart)

return;

int iResult = pthread_create( &m_tThread, &m_tThreadAttr, (tc_thread_func)ThreadRun, this );

m_bStart = true;

Thread::Thread( bool bDetach )使用的实参都是false.

相关问题

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值