死锁二三事

最近解了一些死锁的bug。问题代码如下:

lock.enter();
//do something with so much code
lock.leave();

然后,“do something”代码块抛出异常,导致锁没有被释放。这里的问题是上面的代码在持有锁的时候做了太多的事情,我们使用锁的原则应该是快进快出。

最初,我的解决方法如下,但我后来发现就算这么实现,如果“do something”抛出异常,锁还是不会被释放。try-catch不一定能捕捉到所有的异常,比如写空指针就不行。

bool lock_in_use = false;

void my_function()
{
    bool flag = false;
    lock.enter();
    if (lock_in_use == false) {
        lock_in_use = true;
        flag = true;
    }
    lock.leave();

    if (flag) {
        //do something
    }
    else {
        return;
    }

    lock.enter();
    if (flag == true)
        lock_in_use = false;
    lock.leave();
}

所以我觉得可能需要有一个后台线程不断扫描死锁,一旦找到线程持有锁不释放就杀死这个线程,或者发现持有锁的线程已经死了就打log报错,但是这样依然会造成资源的泄露或者无法回收,所以实际上是没有完美解法的。我们所能做的是,多加log,让代码变得容易调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值