Linux:多线程——死锁以及使用gdb调试多线程程序时常用的命令
死锁
死锁:指在一组进程中的各个进程均占有不是放的资源,但因相互申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。
情况一:当多个执行流使用同一个互斥锁的时候,有一个执行流获取到互斥锁之后,没有释放互斥锁,导致其他执行流都卡死在加锁的接口中的现象被称之为死锁。
情况二:多个执行流,多个互斥锁的情况下,没一个执行流都占有一把互斥锁,但是都想申请对方的互斥锁,这种情况下,就会导致各个指令流都阻塞掉,这种现象称为死锁。
死锁产生的四个必要条件
(1) 互斥条件:一个资源每次只能被一个执行流使用
(2)请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放
(3)不可剥夺条件:一个执行流已经获得资源,在未使用完成之前,不能强行剥夺
(4)循环等待条件:若干个执行流之间形成一种头尾相接的循环等待资源的关系
预防死锁
(1)破坏必要条件
(2)加锁顺序一致
(3)不要忘记解锁,在所有的可能导致执行流退出的地方都进行解锁
(4)资源一次性分配
使用gdb调试多线程程序时常用的命令
info threads:查看当前进程的线程
thread [id] : 切换调试的线程为指定ID的线程
thread apply all bt:查看多个线程堆栈
t [线程编号]:跳转到具体线程的堆栈中
f[堆栈编号]:跳转到某一个堆栈当中去
gdb attach [pid]:将进程附加到gdb