问题
一个线程多次尝试获取同一个互斥量,会发生什么?
不同类型的互斥量
Linux 上的示例程序
死锁的概念
等待关系
- 线程所需资源被其他线程所持有,进而必须等待 (无法继续执行)
循环等待
- 当线程之间出现循环等待关系时,即:发生死锁
下面的程序有问题吗?为什么?
互斥量的类型设置
不同类型的互斥量示例
互斥量小结
PTHREAD_MUTEX_NORMAL
- 一旦互斥量上锁 "上锁",任何线程均无法再次获取互斥量
PTHREAD_MUTEX_RECURSIVE
- 同一个线程可多次获取互斥量,同时需要相同次数的释放互斥量
PTHREAD_MUTEX_ERRORCHECK
- 同一个线程再次获取互斥量时,将错误返回
下面的程序执行后会发生什么?
死锁的 4 大条件
存在互斥资源
- 代码中存在临界区 => 即:多个线程可能同时进入临界区
持有资源并等待资源
- 线程可能需要同时获取多个互斥量才能进入临界区
资源不可剥夺
- 线程获取的互斥量不能被其他线程再次获取
存在循环等待
- 线程与资源之间的等待关系存在环路
如何避免死锁?
破坏死锁条件中的任意一个!
死锁模型
避免死锁的经验方法
按序获取
- 如果存在多个互斥量,必须按序获取互斥量
设置等待超时
- 若超时未能获取互斥量,则释放已获取的互斥量
全局唯一互斥量
- 仅使用一个全局互斥量对所有临界区进行访问 (不建议!)
死锁判断示例
假设有 三个线程 (A,B,C) 和三个互斥量 (R,S,T),三个线程对互斥量的获取及释放如下,问:是否可能发生死锁?