线程:轻量级的进程,栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。
1. 线程的创建
线程由所属的进程创建,进程为其分配独立的栈区空间,
堆区,数据区,文本区与其他线程和所在进程共享。
2. 线程调度
宏观并行, 微观串行
3. 线程的消亡
1. 线程退出
2. 回收线程资源
进程和线程的区别:
定义:
进程:正在执行的程序 ,是操作系统资源分配的最小单位
线程:线程一定属于进程。与同一进程中的其他线程共用进程的堆区,数据区,文本区 线程是cpu任务调度的最小单位。
资源消耗:
进程:进程消耗的资源空间大
线程: 消耗的资源空间小,只需分配栈区
效率角度:创建线程比创建进程效率高,任务切换跨进程效率低于跨线程
安全角度:由于进程空间独立,所以安全性比线程高。
通信角度:进程间不能直接通信,需要使用进程间通信方式(IPC)实现
线程可以直接通信,比如:全局变量
1. 创建线程:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:创建一个线程
参数:
thread: 保存线程ID的变量地址
attr:线程属性 默认属性:NULL
void *(*start_routine) (void *) : 线程任务处理函数
arg:传递给任务处理函数的参数。
返回值:
成功:0
失败:非0
pthread_self()
功能:获取当前线程的id号
2. 线程退出及资源回收
1. 退出
1)在线程任务中调用return;
2)在线程任务pthread_exit
int pthread_join(pthread_t thread, void **retval);
功能:
阻塞回收线程的资源, 状态
参数:
thread:需要回收的线程ID
retval:保存线程退出时的状态
比如:return 返回的内容地址
成功:0
什么样的指针可以被函数返回(指针函数):
1. 不能是局部变量的空间地址
2. 能返回不被销毁的空间地址
1. 全局变量
2. 静态变量
3. 堆区开辟的没被free的空间地址
4. 字符串常量地址
5. 通过参数传递过来的地址
线程非分离属性:能被pthread_join回收或者能被其他线程结束的线程,称为具有非分离属性的线程。
线程分离属性:不需要回收,或者执行结束会被系统回收的线程,称为分离属性的线程。
pthread_detach(pthread_t tid);
什么场景下设置分离属性:负责回收的进程(线程)无暇回收时。
如何设置:
1. 定义一个线程属性对象:pthread_attr_t
2. 初始化线程属性对象:pthread_attr_init();
3. 设置线程的分离属性:pthread_attr_setdetachstate();
4. 以分离属性创建线程:pthread_create();
5. 销毁属性对象:pthread_attr_destroy();