第二章 线程

来源:互联网 发布:网络交友的利与弊结尾 编辑:程序博客网 时间:2024/04/30 05:25
第二章 线程
1、建立和使用线程
1)线程标识符ID
表示线程,属于封装的pthread_t类型,保存在共享(静态或外部)变量,或者保存在堆空间的结构体中
2)线程函数
只有一个void *类型参数,并返回相同的类型值
3)创建线程
通过向pthread_create函数传送线程函数地址和线程函数调用的参数来创建线程,返回线程ID,并保存在thread参数中
4)使用线程
pthread_self获取自身的ID
pthread_equal比较两个线程ID
pthread_join获得线程的返回值,阻塞其调用者知道指定线程终止
pthread_exit来终止自己
pthread_detach分离线程不会对其他线程带来任何影响,没有被分离的线程终止时会保留其虚拟内存,包括堆栈和其他系统资源
初始线程(主线程)是特殊的

2、线程的生命周期
线程状态

线程状态切换

1)创建线程
①进程的初始线程随着进程的创建而创建
②其他线程通过显示的函数调用建立,函数pthread_create
线程创建后,处于就绪状态
线程创建和被调度执行不存在同步关系
2)线程启动
线程启动函数执行,参数也是在创建线程时指定
初始线程和普通线程的区别:
①main函数调用参数(argc和argv)与普通线程的启动参数(void *参数)
②普通线程从启动函数返回,线程终止而其他线程依然运行;初始进程从main函数返回,进程终止
③初始线程调用pthread_exit终止时,其他线程继续执行
④初始线程运行在默认进程堆栈上,普通线程堆栈会溢出
3)运行和阻塞
线程睡眠:被阻塞(某个资源不可用)和被抢占(系统将处理器分配给其他线程,如:时间片)
①就绪:刚被创建或者被解除阻塞在再次可以运行
②运行:某个其他线程被阻塞或者被时间片机制抢占,处理器保存被阻塞或抢占线程的环境并恢复就绪线程的环境
③阻塞:试图加锁一个已经被锁住的互斥量;等待某个条件变量;执行无法立即完成的I/O操作
4)终止
如果线程已经被分离,则进入下一环节——回收;否则,线程处于终止态,可以被其他线程调用pthread_join连接
僵线程:即使它们死了但还存在,可能会保留运行时的大部分资源,使用detachstate属性建立线程使其自动分离
终止后线程至少保留了线程ID和void *返回值
5)回收
使用detachstate属性建立线程,或者调用pthread_detach分离线程,则当线程结束时将被立即回收
回收:释放所有在线程终止时未释放的系统和进程资源,包括保存线程返回值的内存空间、堆栈、保存寄存器状态的内存空间
原创粉丝点击