我正在开发一个使用QSerialPort通过uart接收数据的应用程序。在此应用程序中,我使用写入文件的日志功能。在写入文件之前,应用程序将锁定互斥锁;在写入文件之后,应用程序将解锁互斥锁。在互斥锁和解锁之间,我不会再次调用log函数。
当然,来自串行端口的数据异步到达,并触发信号和用于处理数据的插槽。在处理数据的此函数中,我再次调用log函数。
据我所知,我没有在应用程序中使用多线程,因为我知道插槽是在同一线程中调用的。
问题是:当来自QSerialPort的数据恰好在锁定日志功能中的互斥锁之后到达时,单线程会自身死锁吗? (这意味着相同互斥锁的双重锁定-假设我们不使用递归互斥锁)
关于此主题是否有很好的知识来源?
答案 0 :(得分:1)
如果您的串行端口恰好在互斥锁锁定之后获取数据,它将不会立即执行(因为这不是中断),而是等待QEventLoop
执行接收数据插槽的时间(在全局事件循环中)。您可以使用qApp->processEvents()
手动执行所有事件,因此请避免在锁定/解锁块内使用它。
如果在单线程中使用显式调用log函数,则不会出现死锁(我认为)。但是要小心通过重新实现qDebug()
的{{1}}宏编写日志,因为您可以忘记并在互斥锁/解锁块中使用qInstallMessageHandler
。然后您将陷入僵局。
此外,在您的锁定/解锁块中使用回调函数可能还会带来一些麻烦。所以也要小心回调。