【问题标题】:Deadlocks, Mutexes and Signal,Slots in QtQt 中的死锁、互斥体和信号、插槽
【发布时间】:2019-05-23 13:41:15
【问题描述】:

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

当然,来自串口的数据是异步到达的,它会触发一个信号和一个处理数据的槽。在处理数据的这个函数中,我再次调用 log 函数。

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

问题是:当来自 QSerialPort 的数据恰好在 log 函数中的 mutex 被锁定后到达时,单线程是否会死锁? (这意味着同一个互斥锁的双重锁定 - 假设我们不使用递归互斥锁)

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

【问题讨论】:

    标签: qt mutex deadlock


    【解决方案1】:

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

    如果您在单线程中显式调用日志函数,您将不会出现死锁(我认为)。但要小心通过qDebug() 宏编写日志并重新实现qInstallMessageHandler,因为您可能会忘记并在互斥锁/解锁块中使用qDebug()。那么你就会陷入僵局。

    锁定/解锁块中的回调函数也可能会出现一些问题。所以也要小心回调。

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 2015-10-26
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2012-02-18
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多