Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何验证条件变量是否已初始化?_C++_Qt_Asynchronous_Race Condition_Condition Variable - Fatal编程技术网

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()
函数中