一个死锁的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中; 结果忘记去掉互斥了;
按道理,应该配一个图,再加一些代码来记录该问题,就是想用文字的描述来尽量说清楚;