QWaitCondition类介绍:
QWaitCondition是Qt框架提供的同步机制之一,用于线程间的等待和唤醒操作。它配合互斥锁QMutex使用,使线程能够等待特定条件的发生,当条件满足时唤醒等待的线程。通过wait()函数等待条件,wakeOne()和wakeAll()函数唤醒线程,可以实现线程间的协调和同步。同时,QWaitCondition支持超时等待,可以应对条件未满足的情况。它在多线程编程中起到重要作用,确保线程安全和有效的资源共享。
QWaitCondition类主要接口:
void wait(QMutex *mutex, unsigned long time = ULONG_MAX)
- 在互斥锁
mutex
上等待条件的发生,使当前线程进入等待状态。- 参数:
mutex
:互斥锁,用于保护等待条件和共享资源的访问。time
:可选参数,等待的超时时间,默认为ULONG_MAX(无限等待)。- 注意:调用该函数前,需要先获取互斥锁
mutex
,函数内部将释放互斥锁,并在等待期间重新获取互斥锁。void wakeOne()
- 唤醒等待在条件上的一个线程。
- 注意:被唤醒的线程将尝试重新获取互斥锁,以便继续执行。
void wakeAll()
- 唤醒等待在条件上的所有线程。
- 注意:被唤醒的线程将尝试重新获取互斥锁,以便继续执行。
bool wait_for(QMutex *mutex, unsigned long time)
- 在互斥锁
mutex
上等待条件的发生,等待一段时间,直到超时或条件满足。- 参数:
mutex
:互斥锁,用于保护等待条件和共享资源的访问。time
:等待的时间(以毫秒为单位)。- 返回值:等待条件是否满足,如果在超时时间内等待条件满足则返回true,否则返回false。
QWaitCondition类的具体使用场景:
场景一:等待条件的发生并进行处理
QWaitCondition condition;
QMutex mutex;
bool conditionMet = false;
// 在等待条件的线程中
mutex.lock();
//防止虚假唤醒(spurious wakeup)。
while (!conditionMet) {
condition.wait(&mutex); // 线程等待条件的发生
// 处理条件满足后的操作
// ...
}
mutex.unlock();
// 在其他线程中
mutex.lock();
conditionMet = true; // 设置条件满足
condition.wakeOne(); // 唤醒等待的线程
mutex.unlock();
场景二:多个线程等待同一个条件
QWaitCondition condition;
QMutex mutex;
int counter = 0;
// 等待条件的线程1
mutex.lock();
while (counter < 10) {
condition.wait(&mutex); // 线程等待条件的发生
}
mutex.unlock();
// 等待条件的线程2
mutex.lock();
while (counter < 20) {
condition.wait(&mutex); // 线程等待条件的发生
}
mutex.unlock();
// 在其他线程中
mutex.lock();
counter = 15; // 设置条件满足
condition.wakeAll(); // 唤醒等待的线程
mutex.unlock();
场景三:防止虚假唤醒**
QWaitCondition condition;
QMutex mutex;
bool conditionMet = false;
// 在等待条件的线程中
mutex.lock();
while (!conditionMet) {
condition.wait(&mutex); // 线程等待条件的发生
}
mutex.unlock();
// 在其他线程中
mutex.lock();
conditionMet = true; // 设置条件满足
condition.wakeAll(); // 唤醒等待的线程
mutex.unlock();