概述
进程与线程
进程:系统分配资源的基本单位,可以理解为一个正在进行的程序
线程:操作系统调度的最小单位,就是一段代码的执行顺序
注意
1.一个进程必须有一个线程,该线程被称为主线程
2.一个进程可以有多个线程,除了主线程之外的其他线程都称作子线程
3.进程被销毁时,其中的线程也随之销毁
4.线程是轻量级的进程,LWP(light weight process),在linux环境下线程的本质还是进程
5.进程下所有线程都共享该进程的所有资源
线程的特点
线程共享与非共享的资源
共享的
1.文件描述符表
2.每种信号的处理方式
3.当前工作目录
4.用户ID和组ID
5.内存地址空间(.text/.data/.bss/heap/共享库)
非共享的
1.线程ID
2.处理器线程和栈指针(内核栈)
3.独立的栈空间(用户空间栈)
4.errno变量
5.信号屏蔽字
6.调度优先级
线程的优缺点
优点
提高程序并发性
开销小
数据通信,共享数据方便
缺点
库函数,不稳定
调试、编写困难、gdb不支持
对信号支持不好 优点相对突出,缺点均不是硬伤。Linux 下由于实现方法导致进程、 线程差别不是很大
查看指定进程的线程号
ps -Lf pid
pid:进程号
注意
由于线程库原本不是系统本身的,所以在链接时需要手动链接库文件
gcc ***.c -l pthread
线程相关函数
获取当前线程号
简述
线程号只在他所处的进程环境中有效,Linux使用无符号长整数表示
函数
#include <pthread.h>
pthread_t pthread_self(void)
示例
![](https://img-blog.csdnimg.cn/direct/dff9d967479140ccae27303735048be6.png)
创建线程
函数
#include <pthread.h>
int prthread_creat(pthread_t *thread, const pthread_attr_t *attr,void*(*start_routine)(void *)),void *arg;
参数:
thread:线程标识符地址
attr:线程属性结构体地址,通常为NULL
start_rountin:线程函数的入口地址
arg:传送给线程函数的参数
返回值:
成功0
失败非0
示例
运行结果
线程的回收
简述
等待线程结束(此函数会阻塞),并回收线程资源,类似进程的wait函数。如果线程已结束,那么该函数会立即返回
函数
示例
运行结果
线程的分离
简述
使调用线程与当前进程分离,分离后不代表此线程不依赖于当前进程,线程分离的目的是将线程资源的回收工作交予系统自动来完成,也就是说当被分离的线程结束之后,系统会自动回收他的资源,所以此函数不会阻塞
函数
示例
运行结果
案例:多线程遍历字符串
运行结果
线程的退出
函数
示例
运行结果
线程的取消
简述
退出指定线程
函数
示例
运行结果