php电子商务网站开发实例,做空机构的网站,wordpress 页面标签页,景区官方网站建设文章目录 死锁问题场景1场景2死锁的gdb调试造成死锁的必要条件不可剥夺循环等待互斥条件请求和保持 预防死锁破坏必要条件#xff0c;循环等待请求和保持加锁顺序一致避免锁没有被释放资源一次性分配 死锁问题 死锁的两种场景#xff1a; 场景1 线程加锁之后一直没有将锁… 文章目录 死锁问题场景1场景2死锁的gdb调试造成死锁的必要条件不可剥夺循环等待互斥条件请求和保持 预防死锁破坏必要条件循环等待请求和保持加锁顺序一致避免锁没有被释放资源一次性分配 死锁问题 死锁的两种场景 场景1 线程加锁之后一直没有将锁释放在上一篇文中我们模拟过这种场景某个线程拿到锁进行加锁线程退出之前没有释放锁导致后面的线程不能拿到锁一直在等待加锁导致程序一直不退出这也是为什么条件变量等待函数中第二个参数是锁的原因在该函数内部进行解锁防止死锁 场景2
两个线程都想拥有对方的锁导致死锁
两个线程A和B都阻塞在自己的加锁逻辑当中去
代码如下
执行结果程序阻塞了我们来分析一下 死锁的gdb调试
先使用gdb attach [pid]命令进入gdb调试状态
再使用 thread apply all bt来查看所有线程的调用堆栈 t线程序号跳转到某个线程的调用堆栈当中 我们如果想要进入某个具体的堆栈该怎么办呢
f[堆栈号] 可以通过 p [变量名]来打印这个变量其中__owner表示锁被谁拿走了 对应我们的线程可以看到两个锁分别被两个线程持有同时两个线程全部在等待拿锁谁都想拿到对方的锁但是谁也不可能解锁所以谁都不可能拿到对方的锁最后就造成死锁。
造成死锁的必要条件
不可剥夺 线程获取到互斥锁后除非自己释放锁不然其他线程是不可能进行锁的释放的 循环等待 上述场景2线程A拿着1锁请求2锁线程B拿着2锁请求1锁。 互斥条件 一个互斥锁在同一时间只能被一个线程所拥有 请求和保持 吃着碗里的看着锅里的已经拿到一个锁还想请求另一个锁类似循环等待场景 预防死锁
破坏必要条件循环等待请求和保持 我们在加锁的时候可以用pthread_mutex_trylock和pthread_mutex_timedlock( )函数这样就能避免一直死等锁尝试加锁多少次或者超时就放弃加速让其他线程可以拿到锁 加锁顺序一致 都先加一锁再加二锁这样防止一人拿一把锁还继续等着拿第二把锁
避免锁没有被释放 在所有线程可能退出的地方都进行解锁 资源一次性分配
多个资源在代码当中有可能每一个资源都需要使用不同的锁进行保护 例如:使用全局变量A需要1锁用全局变量B需要2锁
就有可能多个线程在使用这两个资源的时候出现循环等待的情况解决方法我们只需要给将A和B用同一把锁保护即可资源一次性分配