最近动手在师兄写的一个小的QT界面上添加了一点小的框架,在调试的过程中程序会crash,找了很久的原因,终于找到的问题的存在,在这里记录一下,以防止以后会碰到类似的情况!
问题:程序crash的地方调试显示 Resource Deadlock,原因在于整个程序同时运行了两个线程,其中一个是图形界面MainWindow的线程,另一个则是定义的接收数据的线程,在图形界面中有一个按钮StopButton,它对应的信号连接着槽stop();而在recv当中如果接收的数据出错则也会调用stop()函数,这样就有一个问题了,当你手动点击图形界面的时候会出发信号,因此调用stop()函数;而这时候如果接收函数没有接收到相应长度的数据包时同样会调用到stop()函数。在stop函数当中有对线程的join()以及delete操作,因此当重复调用stop()的话就会对创建的线程进行两次join()以及delete(事实上程序只执行到join这一步就挂掉了),因此造成了资源死锁的问题。
解决办法:
(1)在stop()函数里加锁
(2) 或者设置一个状态量,在start()函数中设置状态量m_run=ture,只有在m_run为真的时候才执行stop()函数中的操作,同时将m_run置为false,这样就保证了stop()函数不会被同时执行两次。