gpt4 book ai didi

c++ - Qt中两个线程之间的事件同步

转载 作者:行者123 更新时间:2023-11-30 04:26:52 26 4
gpt4 key购买 nike

我有两个线程,比如说线程“A”和线程“B”。线程“A”post 的自定义 QEvent 到线程“B”,然后等待线程“B”处理此事件。

到目前为止我做了什么:

我的事件类:

class IPCMessageEvent : public QEvent
{
public:
IPCMessageEvent(QWaitCondition* pConditions) : QEvent(IPC_MESSAGE_RECEIVED)
, mpWaitCondition(pConditions)
{ };
~IPCMessageEvent()
{
mpWaitCondition->wakeOne();
};
private:
QWaitCondition* mpWaitCondition;
};

我的主题“A”:

QWaitCondition recvCondition;
IPCMessageEvent* pEvent = new IPCMessageEvent(&recvCondition);

QCoreApplication::postEvent(gpApp, pEvent);

QMutex mutex;
mutex.lock();

recvCondition.wait(&mutex, IPC_MESSAGE_WAIT_TIMEOUT);

我的线程“B”:处理接收到的事件并销毁它。 ~IPCMessageEvent 析构函数被调用,因此将为线程“A”中的 recvCondition 启动 wakeOne()

一切似乎都很好,只是一件事!看起来有时 ~IPCMessageEvent 被调用的时间比预期的要早...

QCoreApplication::postEvent(gpApp, pEvent);

<---- pEvent is already destroyed here ---->

QMutex mutex;
mutex.lock();

所以我的 recvCondition.wait(&mutex, IPC_MESSAGE_WAIT_TIMEOUT); 将被锁定并达到超时。

还有其他方法可以进行这种同步吗?或者也许有人对如何解决/克服这个问题有任何建议?

最佳答案

好吧,你有一个典型的竞争条件。您的线程 A 可能在发布事件后直接中断,然后线程 B 处理并销毁它。由于条件变量的通知仅在有人已经在等待时才有效,因此您会错过通知并因此无限阻塞。

因此您需要在发布事件之前锁定互斥量。但是,这需要你的线程B在处理事件时需要锁定这个互斥量。否则,您无法阻止竞争条件,因为线程 B 没有理由等待任何事情(或者知道它应该“等待”直到线程 A 准备好等待条件变量)。

替代方案:

如果在两个线程(或两个线程中的对象)之间使用信号/槽连接,则可以使用Qt::BlockingQueuedConnection。这确保线程 A 在发出信号后阻塞,直到线程 B 中的事件循环处理它。

关于c++ - Qt中两个线程之间的事件同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11259326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com