【linux系列知识】线程
线程
目录
1、简单介绍
轻量级的进程,通信简单,有效利用CPU;明确的执行目的,一个进程内部可以有多个线程,默认一个线程。真正干活的是线程。线程互相独立,所以通信繁琐。
根据是否共享判断是进程或线程。进程是系统最小的分配资源单位,线程是最小的执行单位。
线程也有PCB,所以如果一个进程有多个线程,则有多个PCB。
调试麻烦,error变量不共享。
优点:
- 提高并发性
- 占用资源小
- 方便通信
缺点:
- 调试麻烦
- 库函数,不稳定
- 对信号支持不好
2、线程同步
数据混乱原因:(1)资源共享(2)随机调度(3)缺乏必要的同步机制
资源共享:在主进程创建线程,同时主进程就是主线程,子线程和主线程同时运行的意思就是资源共享。
解决办法:
- 加锁 (文件锁只能启动一个进程)
- 条件变量
- 信号量
加锁
互斥锁:创建——初始化——加锁——解锁——销毁锁
死锁:(1)锁了又锁,第二个永久阻塞
(2)交叉锁,两把锁,两个线程互抢一个,都在抢对方的锁。解决办法:申请锁顺序一致,如果申请到一把锁,申请另外一把的时候申请失败,应该释放已申请的锁。
读写锁
- 特点:读共享,写独占,写优先级高。
- 读写锁仍然是一把锁,有不同的状态:未加锁、读锁、写锁
- 使用场景:适合读线程较多的
条件变量(生产者消费者模型)
作用:避免无必要的竞争,可以引起阻塞,并非加锁,线程阻塞在条件变量处。
信号量(加强版的互斥量)
可有多个锁,允许多个进程访问共享资源。