美文网首页
LeaveCriticalSection有BUG?

LeaveCriticalSection有BUG?

作者: bingo_hzy | 来源:发表于2019-02-21 17:48 被阅读0次

偶然发现Windows API函数LeaveCriticalSection存在一个问题,那就是在调用它离开临界区时,会把临界区引用计数减一,而不判断当前线程是不是拥有该临界区,这样就可能引发问题,比如A线程拥有该临界区,但B线程可以调用LeaveCriticalSection来使得其它等待该临界区的线程拥有该临界区,或者调用LeaveCriticalSection次数大于EnterCriticalSection的次数也可能出现误操作而导致不可预知的后果。

把EnterCriticalSection换下面这一段代码可以有效的防止占用锁的线程已经退出而导致死锁的情况(亲测有效):

//尝试进入临界区
while(!TryEnterCriticalSection(&aoSection)){
    //进入失败,判断当前占有临界区的线程是否还存活
    if(aoSection.RecursionCount > 0){
        DWORD result = WaitForSingleObject(aoSection.OwningThread, 0);
        if(result == WAIT_FAILED){
            //如果线程已经退出,则代表线程被异常结束或代码问题导致锁没有释放,就利用此bug强制释放锁
            long lRecursionCount = aoSection.RecursionCount;
            for(int i = 0; i < lRecursionCount; i++){
                LeaveCriticalSection(&moSection);
            }   
        }
    }
}

相关文章

  • LeaveCriticalSection有BUG?

    偶然发现Windows API函数LeaveCriticalSection存在一个问题,那就是在调用它离开临界区时...

  • 有bug

    七七醒来后,发现自己坐在模拟机内。模拟机已停止运行,所有的装置都已经自动打开。 七七朝两边看了看,其他几个人也刚恢...

  • 有bug

    大家在玩游戏的时候难免会遇到阳寿游戏,其实也就是要看广告获得什么什么东西。但是他就有个bug就是你进去之后直接擦掉...

  • “努力”有bug

    之前看过来自转载简书的关于自律的励志文章,让我才开始知道简书,了解后并加入加入简书。申请账号,填写用户名的时候,我...

  • 报bug的礼仪(8)

    一个bug的闭环除了包括创建bug和解决bug,还应该包括关闭bug。关闭bug有哪些注意事项呢? 最重要的,要看...

  • Objective-C Debug小技巧

    有程序的地方就有bug,有bug的地方就需要debug。对于程序员来说,coding的过程便是制造bug和解决bu...

  • DAY1 现实的BUG和理想的班级

    Day 1作业: 1:写下你母班的bug,这些bug为什么没有被修复?你有什么建议吗? 近期发现的主要bug是有战...

  • 测试鞭腿

    居然有bug

  • 为什么7>56返回true

    近期修改bug的时候,有一个bug被我成为癌症bug,大家听到都哈哈笑 ,其实我也哈哈笑,但是想想是bug,还是要...

  • 简书有bug

    标题显示两个会和下面的头像昵称重合,为什么不限制只显示一行内容呢

网友评论

      本文标题:LeaveCriticalSection有BUG?

      本文链接:https://www.haomeiwen.com/subject/egsdyqtx.html