QWaitCondition类使用说明

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();
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值