如何从其他线程停止Qt并发递归运行功能?

时间:2013-08-10 21:38:03

标签: qt

我想从在其他线程的单独线程中运行的递归函数返回。

我尝试使用Recursive互斥锁,但它不起作用!!

我们如何实现它?

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();
}

2 个答案:

答案 0 :(得分:2)

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

void worker_run () {
   { QMutexLocker locker(&mutex);
     if(stop)
       return;
   }

   qDebug () << count++;
   worker_run();
}

答案 1 :(得分:0)

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

我相信你也错过了对stop变量的volatile限定符(或者至少使用了一些显式的原子数据类型)。