开发者

Linux之死锁与解决方式

目录
  • 死锁
  • 死www.devze.com锁的必要条件
    • 解决方案
  • 总结

    死锁

    死锁:指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

    死锁现象:

    • 现象1,如果执行流加锁完毕后,不进行解锁则会造成死锁(上篇所述);
    • 现象2,线程www.devze.comA获取了1锁,线程B获取了2锁,同时线程A还想获取2锁,线程B还想获取1锁

    现象2模拟:

    Linux之死锁与解决方式

    Linux之死锁与解决方式

    两个线程都处于阻塞状态

    死锁的必要条件

    只要产生死锁,这四个条件一定会出现

    • 互斥:一个执行流获取互斥锁后,其它执行流不能再获取该锁
    • 不可剥夺:A执行流拿着锁,未使用完之前不能被强行剥夺
    • 循环等待:多个执行流拿着对方想要的锁,并且各执行流还去请求对方的锁
    • 请求与保持:执行流本身使用着一把锁并不释放,还在请求别的锁

    解决方案

    使线程的加锁顺序一致

    Linux之死锁与解决方式

    破坏环路等js待条件

    使用非阻塞锁,一旦线程发现请求的锁被使用,就去释放自己拥有的锁

    Linux之死锁与解决方式

    在加锁前,将临界资源一次性分配给线程A再加锁

    try锁:pthread_mhttp://www.devze.comutex_try

    • 申请锁失败,错误码编程会返回
    • 非阻塞锁,申请失败会立即返回

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新运维

    运维排行榜