1.线程的概念
线程——轻量级的进程,线程是CPU执行的最小单位,进程是资源分配的基本单位,线程的创建和调度的时空开销都比进程小;
2.线程的组成
线程组成:线程pid,程序计数器,寄存器集合,栈;
3.线程与进程的关系
(1)线程存在于进程中;
(2)线程共享了进程的资源(代码段,数据段,打开的一些文件);
(3)线程结束不一定导致进程结束;
4.线程的编程过程
线程的编程过程类似于进程的编程过程:线程的创建,线程的执行,线程的结束,线程结束后的资源回收;
5.线程的创建
头文件:#include <pthread.h>
pthread_t tid; //获得tid号
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
返回值:成功时返回0,失败时返回错误码;
功能:该函数可以创建指定的一个线程。
参数:
(1)thread 线程id,需要实现定义并由该函数返回。
(2)attr 线程属性,一般是NULL,表示默认属性。(可结合性+分离属性)
默认(可结合性) -- 自己手动回收
分离属性 -- 系统自动回收
(3)start_routine -- 线程执行函数 (线程回调函数)
本质上是一个函数的名称即可, 线程回调函数 --完成线程任务功能的函数 ,需要调用者自己实现
(4)arg 回调函数的参数,即参数3的指针函数参数。
注:
1. 主函数所在的执行流 --- 主线程
2. 其它的线程 --- 子线程(次线程)
3. 各个线程间 地位是平等
6.获得线程tid
pthread_self():在哪个线程中调用,获得的就是那个线程的tid,用%ld保存tid号;
7.线程的执行
体现在线程的执行函数(回调函数)上;
8.线程的退出
void pthread_exit(void *retval)
功能:结束调用的线程
参数:retval //退出状态值 //传的是,退出状态值 对应的地址
注意:
pthread_exit 本身表示结束线程,如果用在main函数中 表示结束主线程,主线程结束 并不表示进
程,此时,主线程执行流结束,进程会在其余线程都结束后结束;
9.线程的资源回收
int pthread_join(pthread_t thread, void **retval);
功能:等待线程结束
参数:(1)thread --- 线程tid (2)retval --- 用来保存,退出状态值,所在空间的地址
返回值:成功时返回0,失败时返回错误码
注:
线程退出时,可以带出退出状态值,但是传的是,退出状态值对应空间的地址;