当前位置: 技术问答>linux和unix
关于LINUX下的多线程的退出与再次启动
来源: 互联网 发布时间:2015-12-02
本文导语: 本人现在在作的项目是linux下的用到多线程的 ,粗略的估计一下一共有启动了6个子线程,其中有两个线程是用于接收和发送数据的,当session创建时两个线程要启动,如果当会话终止线程要关闭,但现在不知道为什么,第一次...
本人现在在作的项目是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
是一样的,这些和程序的崩溃是否有关
是否有哪位高手指点一下,为什么,或者有对关闭应该怎么处理.非常着急,谢谢.
我是用改变线程中的while循环的flag和Thread_join来等待线程结束的(有时在Thread_join前设一个断点程序不会崩溃)
在linux中使用pthread_create创建了一个线程,在终端上会显示[New Thread 1151359552 (LWP 14854)]的消息.
当退出时会现示[Thread 1151359552 (LWP 14854) exited],
但第2次再创建线程时这些消息没有被显示到终端上,而且第2次启动时线程的ID是和前面被结束了的线程的ID
是一样的,这些和程序的崩溃是否有关
是否有哪位高手指点一下,为什么,或者有对关闭应该怎么处理.非常着急,谢谢.
|
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---函数。
建议楼主修改一下属性
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---函数。
建议楼主修改一下属性
|
把你的pthread_create的写法贴出来啊