返回介绍

QWaitCondition类

发布于 2019-10-04 15:03:52 字数 3124 浏览 979 评论 0 收藏 0

QWaitCondition类是线程之间允许等待/唤醒的条件。 详情请见……

#include <qwaitcondition.h>

所有成员函数的列表。

公有成员

  • QWaitCondition ()
  • virtual ~QWaitCondition ()
  • bool wait ( unsignedlongtime = ULONG_MAX )
  • bool wait ( QMutex*mutex, unsignedlongtime = ULONG_MAX )
  • void wakeOne ()
  • void wakeAll ()

详细描述

QWaitCondition类是线程之间允许等待/唤醒的条件。

QWaitConditions允许一个线程告诉其它线程某种条件已经满足,一个或多个线程可以等待一个由wakeOne()或wakeAll()设定的条件QWaitCondition。使用wakeOne()会唤醒一种随机选择的事件或者wakeAll()会把它们全部唤醒。比如,假定每次用户按下一个键,我们有三个任务要同时执行,每个任务都可以放到一个线程中,每个线程的run()都应该是这样:

  QWaitCondition key_pressed;

  for (;;) {
     key_pressed.wait(); // 这是一个QWaitCondition全局变量
     // 键被按下,做一些有趣的事
     do_something();
  }
  

第四个线程回去读键按下并且每当它接收到一个的时候唤醒其它三个线程,就像这样:

  QWaitCondition key_pressed;

  for (;;) {
     getchar();
	 // 在key_pressed中导致引起任何一个线程。wait()将会从这个方法中返回并继续执行
     key_pressed.wakeAll();
  }
  

注意这三个线程被唤醒的顺序是未定义的,并且当键被按下时,这些线程中的一个或多个还在do_something(),它们将不会被唤醒(因为它们现在没有等待条件变量)并且这个任务也就不会针对这次按键执行操作。这种情况是可以避免得,比如,就像下面这样做:

  QMutex mymutex;
  QWaitCondition key_pressed;
  int mycount=0;

  // 工人线程代码
  for (;;) {
     key_pressed.wait(); // 这是一个QWaitCondition全局变量
     mymutex.lock();
     mycount++;
     mymutex.unlock();
     do_something();
     mymutex.lock();
     mycount--;
     mymutex.unlock();
  }

  // 读取按键线程代码
  for (;;) {
     getchar();
     mymutex.lock();
     // 睡眠,直到没有忙碌的工作线程才醒来。
     while( count > 0 ) {
       mymutex.unlock();
       sleep( 1 );
       mymutex.lock();
     }
     mymutex.unlock();
     key_pressed.wakeAll();
  }
  

互斥量是必须的,因为两个线程试图同时对同一个变量进行修改的结果是不可预知的。

也可以参考环境类和线程类。


成员函数文档

QWaitCondition::QWaitCondition ()

构造一个新的事件信号传输,比如,等待条件,对象。

QWaitCondition::~QWaitCondition () [虚]

删除这个事件信号传输,比如,等待条件,对象。

bool QWaitCondition::wait ( unsignedlongtime = ULONG_MAX )

在线程事件对象上等待。调用这个的线程将会阻塞,直到下列条件之一满足时才醒来:
  • 另一个线程使用wakeOne()或wakeAll()传输信号给它。在这种情况下,这个函数将返回真。
  • time毫秒过去了。如果time为ULONG_MAX(默认值),那么这个等待将永远不会超时(这个事件必须被传输)。如果等待的事件超时,这个函数将会返回假。

也可以参考wakeOne()和wakeAll()。

bool QWaitCondition::wait ( QMutex*mutex, unsignedlongtime = ULONG_MAX )

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。

释放锁定的mutex并且在线程事件对象上等待。mutex必须由调用线程初始锁定的。如果mutex没有在锁定状态,这个函数立即返回。如果mutex是一个递归互斥量,这个函数立即返回。mutex将被解锁,并且调用线程将会阻塞,直到下列条件之一满足时才醒来:

  • 另一个线程使用wakeOne()或wakeAll()传输信号给它。在这种情况下,这个函数将返回真。
  • time毫秒过去了。如果time为ULONG_MAX(默认值),那么这个等待将永远不会超时(这个事件必须被传输)。如果等待的事件超时,这个函数将会返回假。

互斥量将以同样的锁定状态返回。这个函数提供的是允许从锁定状态到等待状态的原子转换。

也可以参考wakeOne()和wakeAll()。

void QWaitCondition::wakeAll ()

这将会唤醒所有等待QWaitCondition的线程。这些线程被唤醒的顺序依赖于操组系统的调度策略,并且不能被控制或预知。

也可以参考wakeOne()。

void QWaitCondition::wakeOne ()

这将会唤醒所有等待QWaitCondition的线程中的一个线程。这个被唤醒的线程依赖于操组系统的调度策略,并且不能被控制或预知。

也可以参考wakeAll()。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文