将谓词传递给 QWaitCondition?
Passing a predicate to QWaitCondition?
我正在 Qt 中编写一些线程,但我不知道如何将谓词传递给我的条件变量以防止虚假唤醒。
C++ 中的工作解决方案:
std::mutex(mu);
std::condition_variable cond;
std::unique_lock<mutex> alpha_lock(mu);
cond.wait(alpha_lock, [](){ return //some condition;});
alpha_lock.unlock();
//Continue to do stuff...
Qt 等价物:
QMutex mu;
QWaitCondition cond;
QMutexLocker alpha_lock&(mu);
cond.wait(&mu, [](){return //some condition;})
错误:
"no matching member function for call to wait"
关于如何在此 Qt 代码中使用谓词有什么想法吗?
正如编译器和@xaxxon 已经指出的那样,QWaitCondition
中没有这样的 wait()
重载。
如果你想在继续之前检查条件,你可以这样做
while (!condition()) {
cond.wait(mutex);
}
如果您在更多地方需要它,您当然可以将它放入一个带有 QWaitCondition
、QMutex
和 std::function
的辅助函数中。或者从 QWaitCondition
派生,添加重载执行上面的循环。
我正在 Qt 中编写一些线程,但我不知道如何将谓词传递给我的条件变量以防止虚假唤醒。
C++ 中的工作解决方案:
std::mutex(mu);
std::condition_variable cond;
std::unique_lock<mutex> alpha_lock(mu);
cond.wait(alpha_lock, [](){ return //some condition;});
alpha_lock.unlock();
//Continue to do stuff...
Qt 等价物:
QMutex mu;
QWaitCondition cond;
QMutexLocker alpha_lock&(mu);
cond.wait(&mu, [](){return //some condition;})
错误:
"no matching member function for call to wait"
关于如何在此 Qt 代码中使用谓词有什么想法吗?
正如编译器和@xaxxon 已经指出的那样,QWaitCondition
中没有这样的 wait()
重载。
如果你想在继续之前检查条件,你可以这样做
while (!condition()) {
cond.wait(mutex);
}
如果您在更多地方需要它,您当然可以将它放入一个带有 QWaitCondition
、QMutex
和 std::function
的辅助函数中。或者从 QWaitCondition
派生,添加重载执行上面的循环。