• 一个死锁的bug(用windows的mutex)


    今天碰到一个bug,噶样的:

    【程序结构】

     有两个线程,主线程和子线程;

    1 主线程为QT应用程序,可以点击按钮啥的;

    2 子线程是一个while,会一直运行;

    子线程主要做两件事情,一件是从共享的消息队列里(非阻塞)查询是否有消息要处理,有就处理,知道队列为空;

    第二件是不停的获取码流数据,并对其进行处理,如显示,录像,统计等;

    【问题发生场景】

    现在主线程有一个操作,比如叫做start;

    主线程要做的事情:

    1 发送一个start的命令到“消息队列”中;

    2 等待该处理的结果,实现方式是不停的检测一个共享内存;

    3 得到结果并返回;

    子线程要做的事情:

    1 while到查询队列处理的地方;

    2 处理该消息,并将处理结果放到共享内存中;

    【造成这个bug的原因】

    按道理,这种结果处理该start场景是没有问题,可惜我确由于一些原因用mutex造成了死锁;

    这里假设有一个全局的mutex,以下是几个关键的地方:

    1 然后start操作用到了该mutex,直到检测共享内存设置,返回结束释放该mutex;

    2 其次,在子线程中,码流处理中,我误用了mutex,但还是对称结构的;

    3 子线程的消息队列处理,需要处理start的命令,并且置全局标志;

    问题就在于,1在发生之后,3先跑了,结果死锁了;

    因为,1要等2完成,2要等3完成,3要等1完成;

    【造成这个bug的原因的原因】

    private函数用了互斥;不能用。。。。。。。。

    原因是,我将一组本来是public的函数,移到另一个类的private中; 结果忘记去掉互斥了;

    按道理,应该配一个图,再加一些代码来记录该问题,就是想用文字的描述来尽量说清楚;

  • 相关阅读:
    IIS配置跨域请求
    ABP框架页面权限验证
    WPF-DataGrid增删改查不绑定数据源
    WPF-DataGrid增删改查绑定数据源
    .NET开发框架集合(长期更新)
    C# Webbrowser 常用方法及多线程调用
    Devexpress-GridLookUpEdit
    Devexpress提示框的使用
    Asp.Net MVC中Action跳转小结
    ASP.NET MVC备忘
  • 原文地址:https://www.cnblogs.com/bluebbc/p/3199255.html
Copyright © 2020-2023  润新知