一个死锁的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中; 结果忘记去掉互斥了;

 

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

posted on 2013-07-18 20:46  bluebbc  阅读(1250)  评论(0编辑  收藏  举报

导航