Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2207593
  • 博文数量: 523
  • 博客积分: 11908
  • 博客等级: 上将
  • 技术积分: 5475
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-03 15:50
文章分类

全部博文(523)

文章存档

2019年(3)

2013年(4)

2012年(71)

2011年(78)

2010年(57)

2009年(310)

分类: LINUX

2011-03-25 12:17:45

线程的生命周期:
就绪(Keady):线程能够运行,但是在等待可用的处理器。可能刚刚启动,或者刚刚从阻塞中恢复,或者被其它线程抢占。
运行(Kunning):线程正在运行。在多处理器系统中,可能有多个线程处于运行态。
阻塞(Blocked):线程由于等待"处理器"外的其它条件而无法运行,如:条件变量的改变,加锁互质量或者等待I/O操作结束。
终止(Terminated):线程从启动函数中返回,或者调用pthread_exit,或者被取消,终止自己并完成所有资源清理工作。不是被分离,也不是被连接,一旦被分离或者被连接,它
就可以被回收。
APUE2:进程终止的方式有:
从main返回
调用exit,_exit,_Exit
最后一个线程从其启动例程返回
最后一个线程调用pthread_exit
初使线程返回或退出,初始线程生成的其它线程继续执行
从main函数返回后,进程终止,其它线程不能继续执行
1.线程创建:主要方式是通过pthread_create创建线程。但是如果进程的信号通知机制设置为SIGEV_THREAD,则当进程收到一个posix信号时也会创建线程。在新线程建立
以后就处于就绪状态,受调度机制的限制可能等待一段时间后才能执行。
有关线程创建最重要的是,在当前线程从pthread_create返回以及新线程被调度执行之间不存在同步关系。
2.线程启动:在初始线程中,线程的启动函数(即main)是从程序外部被调用的。例如,很多UNIX系统中将程序链接到一个crt0.o文件上,该文件负责初始化进程,然后调用main函数。
所以初始线程和普通线程是有区别的。
首先,初始线程和普通线程的调用参数不同,前者是argc, argv,后者是void *。
还有,如果普通线程从启动函数中返回线程终止而其它线程可以继续运行,但是初始线程从main函数返回,进程内所有线程被终止;如果希望初始线程终止时进程中其它线程可以继续执行,
则需要在初始线程中调用pthread_exit函数而不是从main函数中返回。
最后,在大多数系统中,初始线程运行在一个默认的堆栈上,该堆栈可以增长到足够的尺寸;而在某些实现中,普通线程的堆栈是受限的,如果线程堆栈溢出,则程序会因段错误或者
总线错误而失败。
3.运行和阻塞:当线程刚被创建的时,或者线程刚被解除阻塞可以运行时,线程就处于就绪态,就绪的线程等待可用的处理器。同样当一个运行线程被抢占时,比如被时间片机制抢占,线程
立即进入就绪态。
4.终止:当调用pthread_cancel取消线程或者调用pthread_exit退出线程时,线程在调用完每个清理过程后也将进入终止态,这些清理过程是由线程通过调用pthread_cleanup_push
注册的 ,而且尚未通过调用pthread_cleanup_pop删除。
线程还会有私有的“线程特定数据”,如果线程有非空的私有数据值,则与这些数据相关的destructor函数将被调用。
如果线程已经被分离,则立即进入下一状态——回收,否则线程处于终止态,它可以被其它线程调用pthread_join函数连接。
终止后线程应当至少保留了线程ID和void*返回值,该返回值从线程启动函数中返回或者调用pthread_exit设定,通过函数返回或者调用pthread_exit正常终止的线程与通过取消调用而
终止的线程的唯一外部区别是:被取消的线程的返回值始终是PTHREAD_CANCELED.
5.回收:如果使用PTHREAD_CREATE_DETACH属性建立线程或者调用pthread_detach函数分离线程,则线程结束时被立即回收。
如果终止线程没有被分离,则线程一直处于终止态直到被分离(通过pthread_detach)或者被连接(通过pthread_join)。线程一旦被分离就不能够再访问它了。
回收将释放线程终止时未释放的系统资源和进程资源,包括保存线程返回值的内存空间,堆栈,保存寄存器状态的内存空间等。其中一些资源可能在线程终止时被释放,但必须记住:在线程终止
时上述资源就不该被访问了 !
终止线程必须释放由该线程占有的程序资源,调用malloc和mmap分配的内存可以在任何时候,由任何线程释放,互质量,条件变量和信号灯可以由任何线程摧毁,只要它们被解锁并且没有任何
线程等待!但是只有互质锁的主人可以解锁它!如果线程终止时还有没有解锁的互质量,则该互质量不会被再次使用,因为不会被解锁!
阅读(1157) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~