c++中如何防止死锁

1、什么是死锁

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

2、常见的死锁场景
  • 一个线程已经拿到了锁,未释放锁,但是又尝试拿同样的锁,这是就会死锁
  • 两个以上线程A B …,两个以上锁a b…,线程A已经拿到a锁,线程B已经拿到b锁,但是线程A在没有释放a锁尝试获取b锁,线程B没有释放b锁尝试获取a锁,这时也会发生死锁
3、预防死锁的办法
  • 加锁的时候使用try_lock(),如果获取不到锁,那么就释放自己手里面得所有锁,
  • 可以在加锁的过程中对metux进行地址的比较永远从最小地址开始加锁,这样的话就能保证所有的线程都按同一个顺序加锁,这样的话也能避免死锁
  • 可以设置锁的属性为PTHREAD_MUTEX_ERRCHECK,这种锁如果发生死锁会返回错误,不过效率要稍微低一些。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值