QWaitCondition

39 篇文章 1 订阅

   该类提供一个情况变量来同步线程。

   #include <QWaitCondition>

   注意:该类所有的函数是线程安全的。

   公共函数:

 

QWaitCondition ()

 

~QWaitCondition ()

bool

wait ( QMutex * mutex, unsigned long time = ULONG_MAX )

bool

wait ( QReadWriteLock * readWriteLock, unsigned long time = ULONG_MAX )

void

wakeAll ()

void

wakeOne ()

  详细描述:

   该类允许一个线程来告诉其他线程一些种情况已经被遇到。一个或者多个线程能阻塞等待为一个QWaitCondition来设置一个情况用wakeOne()或wakeAll()。使用wakeOne()来随机唤醒一个被选择的情况或者wakeAll()来唤醒所有的。

 

   例如,假定我们有三个任务,应该被执行,当使用者按下一个键。每个任务能被放入一个线程。每个都有一个run像这样:

forever {
     mutex.lock();
     keyPressed.wait(&mutex);
     do_something();
     mutex.unlock();
 }

   这里keyPressed变量是一个全局的QWaitCondition

   第四个线程将读键按下 和唤醒其他的三个线程,

forever {
     getchar();
     keyPressed.wakeAll();
 }

    三个线程按顺序被唤醒时没有定义的。如果一些线程仍然在do_sth()当键被按下,他们将不被唤醒。所以任务将并不被执行。这种情况能被解决,通过使用一个counter和一个QMutex来保护她。例如:

forever {
     mutex.lock();
     keyPressed.wait(&mutex);
     ++count;
     mutex.unlock();
 
     do_something();
 
     mutex.lock();
     --count;
     mutex.unlock();
 }

   下面是代码为第四个线程

forever {
     getchar();
 
     mutex.lock();
     // Sleep until there are no busy worker threads
     while (count > 0) {
         mutex.unlock();
         sleep(1);
         mutex.lock();
     }
     keyPressed.wakeAll();
     mutex.unlock();
 }

   Mutex是必须的,因为两个线程的结果视图改变相同的变量的值。

   等待情况是一个强大的原始线程同步。等待情况例子展示怎样使用QWaitCondition作为一个替代QSemaphore来控制进入一个循环buf被一个生产者线程和消费者线程。

   成员函数文件

    QWaitCondition::QWaitCondition ()

    QWaitCondition::~QWaitCondition ()

    bool QWaitCondition::wait ( QMutex * mutex, unsigned long time = ULONG_MAX )

   释放锁定的mutex和等待waitCondition。Mutex必须被调用的线程原始锁定。如果mutex不是在一个锁定的状态,这个函数立即返回。如果mutex是一个递归的mutex,这个函数立即返回。Mutex将被解锁,调用线程将阻塞直到这些情况被遇到:

    1.另一个线程用wakeOne()或者wakeAll()发射信号。这个函数将返回true

    2.time超时。如果time是ulong_max(默认的),然后等待将绝不超时。这个函数将返回false,如果等待超时

 bool QWaitCondition::wait ( QReadWriteLock * readWriteLock, unsigned long time = ULONG_MAX )

   void QWaitCondition::wakeAll ()

   唤醒所有在等待waitCondition的线程。唤醒的顺序依赖于操作系统的政策,不能被控制。

   void QWaitCondition::wakeOne ()

   唤醒一个线程,等待waitCondition的。线程的唤醒取决于操作系统的政策,不能被控制。

   如果你想唤醒一个特别的线程,解决办法是使用不同的等待情况。

 

参考:

https://www.yuque.com/docs/share/ae8a7fa1-d634-4113-8ff7-f095b6abcaa0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值