如何停止来自其他线程的Qt并发递归运行函数



我想从递归函数返回,该函数在一个独立于其他线程的线程中运行。

我尝试过递归互斥,但它不起作用!!

我们如何才能做到这一点?

bool stop = false;
QMutex mutex(QMutex::Recursive);
int count = 1;
void worker_run () {
   QMutexLocker locker(&mutex);
   if(stop)
       return;
    qDebug () << count++;
    worker_run();
}
void worker_stop () {
    QMutexLocker locker(&mutex);
    stop = true;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QtConcurrent::run(&worker_run);
    QtConcurrent::run(&worker_stop);
    return a.exec();
}

我认为问题在于对worker_run()的递归调用不能解锁互斥锁。请记住,当QMutexLocker超出范围时,它将解锁。然后给它一个范围。。。

void worker_run () {
   { QMutexLocker locker(&mutex);
     if(stop)
       return;
   }
   qDebug () << count++;
   worker_run();
}

删除所有互斥对象,然后重试。原因是worker_run不是一个关键区域,除了对stop变量的访问,它被授予原子访问权限。

我相信您还缺少停止变量的volatile限定符(或者至少使用一些显式原子数据类型)。

最新更新