线程的状态

一 线程的四个基本状态

(一)就绪状态:线程能够运行,但在等待可用处理器。

*可能刚刚启动,或刚从阻塞状态恢复,或者被其它线程抢占。


(二)运行状态:线程正在运行。在多处理器系统中,可能有多个线程处于运行态。

1.初始线程(即主线程)与普通线程的一些不同:

*初始线程的启动函数(即main函数),是从程序外部调用的,启动函数的参数也和普通线程不同。

*普通线程从启动函数返回,则该线程终止而其它线程继续运行;但初始线程从main函数返回,进程终止(进程中的所有线程也终止),所以需要在初始线程中调用pthread_exit而不是从main函数返回。

*大多数系统中,初始线程运行在默认的进程的堆栈上,该堆栈可以增长到足够的大小;而有些实现中,普通线程的堆栈是受限的,如果线程堆栈溢出,则程序会因段错误而失败。


(三)阻塞状态:线程由于等待处理器外的其他条件无法运行,如条件变量的改变、加锁互斥量或等待I/O操作结束。


(四)终止状态:线程从启动函数返回;或调用pthread_exit,或者被取消;终止自己并完成所有资源清理工作。

1.终止状态不是被分离状态(调用pthread_detach等),也不是被连接(其它线程调用pthread_join),一旦线程被分离或被连接,它就可以被收回。

2.线程进入终止状态后,如果线程已经被分离,则它立即进入回收阶段;否则,线程处于终止态,直到被分离(通过pthread_detach)或被连接(调用pthread_join)。

3.僵死线程:处于终止态但还未被回收,会保留其运行时的大部分甚至所有资源;当创建线程不需要连接(即调用pthread_join),应该使用detachstate属性建立线程使其自动分离。


二分离状态:

(一)分离状态线程特点

1.默认情况下,线程的终止状态会保存到对该线程调用pthread_join;如果线程处于分离状态,线程的底层存储资源可以在线程终止时立即被收回

2.不能对分离状态的线程调用pthread_join,返回EINVAL错误。默认情况下,线程是可结合的(即可以调用pthread_join的)。


(二)线程资源的回收:

1.回收将释放所有在线程终止时未释放的系统和进程资源,包括保存线程返回值的内存空间、堆栈、保存寄存器状态的内存空间等。其中一些资源可能已经在线程终止时释放,但必须记住:在线程终止后上述资源就不该被访问了。

2.终止线程将释放所有系统资源,但你必须释放由该线程占有的程序资源。

*调用malloc或mmap分配的内存可以在任何时候、有任何线程释放。

*互斥量、条件变量和信号量可以被任何线程销毁,但前提是它们被解锁并没有线程等待。但是互斥量只有加锁的主人才能够解锁,如果在线程终止时还有加锁的互斥变量,则该互斥量就不能被再次使用。

3.为了避免存储器资源泄露,每个可结合线程(joinable)应该要么被其它线程显示的回收(即调用pthread_join),要么通过调用pthread_detach被分离。


(三)把线程设置为分离状态的三个方法:

1.线程调用pthread_detach函数进入分离状态。

2.修改线程属性pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。

3.其它线程调用pthread_join使该线程进入分离状态。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值