【发布时间】:2021-02-09 23:22:37
【问题描述】:
在 Qt 中,如果信号可以在我连接到它们的大约同一时间发出,如何避免竞争条件?
考虑以下简单示例:
MySignalSender *sender = new MySignalSender(); // starts async operation that emits `fooSignal`
// <-- Possibility (1): `fooSignal` can be emitted here
MySignalReceiver *receiver = new MySignalReceiver();
// <-- Possibility (2): `fooSignal` can be emitted here
QObject::connect(sender, &MySignalSender::fooSignal, receiver, &MySignalReceiver::fooSlot);
// <-- Possibility (3): `fooSignal` can be emitted here or later
由于fooSignal 是从另一个线程发出的,因此调度程序在运行时非确定性地实现了可能性 1-3 的选择。虽然只有在第三种情况下才能实现所需的行为,但在剩下的两种情况下我们会丢失信号,可能会导致死锁或其他一些未定义的行为。
Qt 是否提供一些原子机制来临时暂停来自对象的信号?我知道QObject::blockSignals(),但我的理解是这会完全抑制信号,而不仅仅是将它们推迟一段时间。
提前谢谢你!
【问题讨论】:
标签: c++ qt signals-slots qobject qeventloop