Qt中的死锁,互斥和信号,插槽

时间:2019-05-23 13:41:16

标签: qt mutex deadlock

我正在开发一个使用QSerialPort通过uart接收数据的应用程序。在此应用程序中,我使用写入文件的日志功能。在写入文件之前,应用程序将锁定互斥锁;在写入文件之后,应用程序将解锁互斥锁。在互斥锁和解锁之间,我不会再次调用log函数。

当然,来自串行端口的数据异步到达,并触发信号和用于处理数据的插槽。在处理数据的此函数中,我再次调用log函数。

据我所知,我没有在应用程序中使用多线程,因为我知道插槽是在同一线程中调用的。

问题是:当来自QSerialPort的数据恰好在锁定日志功能中的互斥锁之后到达时,单线程会自身死锁吗? (这意味着相同互斥锁的双重锁定-假设我们不使用递归互斥锁)

关于此主题是否有很好的知识来源?

1 个答案:

答案 0 :(得分:1)

如果您的串行端口恰好在互斥锁锁定之后获取数据,它将不会立即执行(因为这不是中断),而是等待QEventLoop执行接收数据插槽的时间(在全局事件循环中)。您可以使用qApp->processEvents()手动执行所有事件,因此请避免在锁定/解锁块内使用它。

如果在单线程中使用显式调用log函数,则不会出现死锁(我认为)。但是要小心通过重新实现qDebug()的{​​{1}}宏编写日志,因为您可以忘记并在互斥锁/解锁块中使用qInstallMessageHandler。然后您将陷入僵局。

此外,在您的锁定/解锁块中使用回调函数可能还会带来一些麻烦。所以也要小心回调。