C++ 如何验证条件变量是否已初始化?
我在解决获取锁时出现的竞争条件时遇到一些问题。我有一个异步触发的大型计算。我需要在大型任务开始之前结束上一个同步任务。大任务启动并等待条件变量,在理想情况下,小任务完成后将通知条件变量。我的问题来自大任务启动过快,而小任务触发的条件变量尚未完全初始化,因此实际上不会触发,导致程序被锁定 我把它归结为这个最小的例子 我认为这是一个常见的问题。如何检查我的条件变量是否实际拥有互斥锁并被锁定C++ 如何验证条件变量是否已初始化?,c++,qt,asynchronous,race-condition,condition-variable,C++,Qt,Asynchronous,Race Condition,Condition Variable,我在解决获取锁时出现的竞争条件时遇到一些问题。我有一个异步触发的大型计算。我需要在大型任务开始之前结束上一个同步任务。大任务启动并等待条件变量,在理想情况下,小任务完成后将通知条件变量。我的问题来自大任务启动过快,而小任务触发的条件变量尚未完全初始化,因此实际上不会触发,导致程序被锁定 我把它归结为这个最小的例子 我认为这是一个常见的问题。如何检查我的条件变量是否实际拥有互斥锁并被锁定 #include <QCoreApplication> #include <QObject&
#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();
}
#包括
#包括
#包括
#包括
#包括
#包括
类工作单元:公共QObject
{
Q_对象
公众:
工作单元(QObject*父对象)
{
m=新的QMutex();
m->lock();
w=新的QWaitCondition();
}
QWaitCondition*w;
QMutex*m;
公众时段:
void runMe()
{
w->等待(m);
m->unlock();
//执行长时间计算
}
};
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
工作单元*mUnit=新工作单元(&a);
QFutureWatcher w;
QObject::连接(&w,信号(finished()),&a,插槽(quit());
QFuture f=QtConcurrent::run(mUnit和workUnit::runMe);
w、 setFuture(f);
_sleep(1000);//有了这个延迟它就工作了,没有延迟它就不工作了
mUnit->w->wakeAll();//这将由另一个进程触发
返回a.exec();
}
QWaitCondition::wait的文档说明:
互斥锁最初必须由调用线程锁定
您应该删除
m->lock()在调用wait
之前,从构造函数中选择code>,并将其放入runMe()
函数中 QWaitCondition::wait
的文档说明:
互斥锁最初必须由调用线程锁定
您应该删除m->lock()在调用wait
之前,从构造函数中选择code>,并将其放入runMe()
函数中