我想从递归函数返回,该函数在一个独立于其他线程的线程中运行。
我尝试过递归互斥,但它不起作用!!
我们如何才能做到这一点?
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限定符(或者至少使用一些显式原子数据类型)。