递归锁

近日在调试一个线程挂起的BUG,究其原因是该用递归锁的地方使用了普通的互斥锁,导致了死锁。

  趁着这个机会也好好了解了一下很少用到的递归锁。

  所谓递归锁,就是在同一线程上该锁是可重入的,对于不同线程则相当于普通的互斥锁。

  例如:有互斥量LOCK

  func A () {  

     LOCK.lock();

     B();

    LOCK.unlock();

  }

  func B() {

     LOCK.lock();

     LOCK.unlock();

  }

 则在同一线程上函数A是不会形成死锁的,但此时如果其他线程想要加锁,只有等待拥有锁的线程释放所有的锁。(加锁几次要释放几次)

 递归锁与条件变量在一起使用的时候要特别小心,若线程A加了递归锁没有完全释放就进入了条件变量,等待唤醒。则线程B试图唤醒A时,由于A的递归锁没有完全释放,所以会导致死锁。      

 递归锁在JAVA中仅仅用一个关键字synchronized就能实现,而且该关键字可以选择锁的对象。

 在C/C++中(linux下)就需要使用pthread库中提供的互斥锁,并且设置锁的属性为递归锁:

  pthread_mutex_t  Mutex;

  pthread_mutexattr_t attr;

  pthread_mutexattr_init(&attr);

  pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);

  pthread_mutex_init(&Mutex, &attr);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值