目录
六、多进程和多线程优缺点:(资源丰富用进程,资源紧缺用线程------效率上半斤八两,进程像立交桥,线程像平面交通,如果考虑到)
一、线程的基本概念
1.概论:线程是 "轻量级(创建的是栈区)进程(所以有进程特性)",它不能独立存在,必须依附于某个进程(进程是线程的 "资源容器" )。
2.作用:实现并发处理------ 比如一个程序要同时下载文件 + 显示进度,用线程分任务比开多个进程更高效。
3.核心特征:
进程是 "最小资源分配单位"(系统给进程分配内存、文件描述符);线程是 "最小执行单元"(CPU 实际调度的是线程)。
同一进程内的线程是 "平级关系",仅默认存在一个 "主线程"(进程启动后自动创建的第一个线程)。
二、进程和线程的核心区别;
总结:
进程是操榨系统资源分配的最小单元(进程可以独立存在,线程必须依附于进程而存在)
线程是CPU任务调度的最小单元(线程在CPU中会被认为是一个进程)
三、线程的创建
每个线程会创建一个属于该线程的独立的栈空间默认为8M,文本区、数据区、堆区使用进程中的区域
四、线程的调度
等同于进程的调度
宏观并行微观串行
五、线程的消亡
等同于进程的消亡,线程消亡需要回收线程空间
六、多进程和多线程优缺点:(资源丰富用进程,资源紧缺用线程------效率上半斤八两,进程像立交桥,线程像平面交通,如果考虑到)
1.进程(Linux中用得更多)(不同一软件间用进程)
优点:①每个进程空间独立,安全性好,一个进程异常崩溃不影响其余进程
缺点:①多线程调度,效率低,因为切换进程任务时需要映射不同的物理地址空间,增大系统开销 ②多进程通信不方便,因为空间独立,没有共享空间
2.线程(Windows中用得更多)(同一软件内不同任务用线程)
缺点:线程位于进程空间内部,线程异常崩溃会导致进程崩溃,进程中其余的线程均结束
优点:①多线程调度,效率高,因为在同一进程空间内部切换不同任务
②多线程通信非常方便,多线程数据区,堆区共享
③通过锁的机制防止资源竞争
六、线程相关函数接口
注意:
①头文件:#include <pthread.h>
②编译时需链接库
- pthread_create
原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
功能:创建一个线程任务
参数:
thread:存放线程ID空间首地址
attr:线程的属性,使用默认属性传NULL
start_routine:线程函数入口(即线程函数名)
arg:线程函数的参数(没有则使用默认属性传NULL)
返回值
成功:返回0
失败:返回错的数
示例:创建四个线程,每个线程打印自己的id
结果:
补充:
代码改进(pro版):
代码改进(max版):
结果:
- pthread_exit
原型:void pthread_exit(void *retval);
作用:线程主动结束自身执行。(与线程函数里的return NULL效果相同)
参数 retval:线程的"返回状态"(可被后续回收操作获取)
返回值:缺省
3.阻塞式回收: pthread_join
原型:int pthread_join(pthread t_thread, void **retval);
作用:阻塞回收线程空间(相当于进程中的wait)(等待指定线程结束,并回收其资)
特点:调用该函数a'a的线程会"阻塞"(暂停执行),直到目标线程结束
参数:
thread:线程
retval:存储目标线程的返回状态(对应 pthread_exit 的参数)
返回值:
成功:返回0
失败:返回非0
应用:
阻塞回收线程空间
实现线程的同步(保证pthread_join后续代码是在线程结束之后执行)
代码:
结果:
- pthread_self() //获得线程ID号
使用线程与调函数的区别












