gpt4 book ai didi

c++ - 如何验证条件变量是否已初始化?

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:44 25 4
gpt4 key购买 nike

我在解决获取锁时出现的竞争条件时遇到了一些问题。我有一个异步触发的大型计算。我需要在大型任务开始之前结束我之前的同步任务。大型任务启动并等待条件变量,在理想情况下,小型任务将在完成时通知条件变量。我的问题是大任务启动的太早,小任务触发的条件变量还没有完全初始化,因此没有真正触发,导致程序被锁定。

我已将其归结为这个最小示例。

我认为这是一个常见问题。我如何检查我的条件变量是否确实获得了互斥量并被锁定?

#include <QCoreApplication>
#include <QObject>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
#include <QFutureWatcher>
#include <QWaitCondition>

class workUnit: public QObject
{
Q_OBJECT

public:
workUnit(QObject *parent)
{
m = new QMutex();
m->lock();
w=new QWaitCondition();
}
QWaitCondition* w;
QMutex* m;

public slots:
void runMe()
{
w->wait(m);
m->unlock();
//perform long computation
}
};


int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
workUnit* mUnit=new workUnit(&a);
QFutureWatcher<void> w;
QObject::connect(&w, SIGNAL(finished()), &a, SLOT(quit()));
QFuture<void> f = QtConcurrent::run(mUnit,&workUnit::runMe);
w.setFuture(f);
_sleep(1000);//with this delay it works, without the delay it doesn't
mUnit->w->wakeAll();//This would be triggered by another process
return a.exec();
}

最佳答案

QWaitCondition::wait 的文档指出:

The mutex must be initially locked by the calling thread.

您应该从构造函数中删除 m->lock(); 并在调用 wait 之前将其放入 runMe() 函数中>。

关于c++ - 如何验证条件变量是否已初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15452816/

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