什么是线程
- 线程是比进程的执行粒度更细的一个执行流(线程是进程的子集),是进程内部的执行分支(可理解为线程是在进程的地址空间内运行),是调度的基本单位。
- 一个进程至少有一个执行线程
- Linux没有真正的线程,但它用进程来模拟实现线程,而这种进程被称为轻量级进程。
- 线程用TCB管理,但是Linux下没有TCB,因此Linux用PCB模拟TCB,创建进程只有创建PCB,再分配资源即可,并且cup认为PCB为调度的基本单位。
线程和进程的比较
- 进程时资源竞争的基本单位
- 线程是程序执行的最小单位
- 线程共享同一进程数据,但也拥有自己独立的一部分数据,如自己的上下文数据(主要用于恢复数据)、线程ID、私有结构栈、寄存器、errno、信号屏蔽字、调度优先级,所以线程相对于进程而言,创建和调度成本低。
- 一个进程的多个线程共享以下数据:同一个地址空间、文件描述符表、每种信号的处理方式、当前工作目录、用户ID和组ID,一个进程只有一个主线程
线程的优点
- 创建成本低。
- 调度(选择、切换)成本低。
- 占用资源少。
- 能充分利用多处理器的可并行数量。
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算机任务。
- 计算密集型应用的时候,为了能在多处理器系统上运行,将计算分解到多个线程中实现。
- 线程可以同时等待不同I/O操作。
线程的缺点
- 性能损失(主要体现在计算密集型线程,由于该线程不可和其他线程公用同一个处理器,所以当该线程数量超过处理器数量的时候,就会增加额外的同步和调度开销,而可用的资源不变)
- 健壮性降低(线程和线程间缺乏安全性)
- 缺乏访问控制(也就是一个线程在调用某些OS函数时,会影响整个进程,更通俗一点就是,一个线程的某些操作会影响整个进程,特别是当一个线程出错的时候,整个进程就会被释放)
- 编辑难度提高
线程控制
POSI线程库
- 和线程有关的函数构成可一个完整的系列,一般都以pthread_ 开头。
- 链接这些线程函数时需要使用编译器命令的“-lpthread”选项。
- 头文件”pthread.h”
创建线程
int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void*) void* arg);