
楼主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.
相关问题
◆◆
评论读取中....
请登录后再发表评论!
◆◆
修改失败,请稍后尝试
796

被折叠的 条评论
为什么被折叠?



