zoukankan      html  css  js  c++  java
  • qt翻译--QWaitCondition

    QWaitCondition Class Reference
    [QtCore module]

    该类提供一个情况变量来同步线程。
    #include <QWaitCondition>
    注意:该类所有的函数是线程安全的。
    公共函数:
     
    bool
    wait ( QMutex * mutex, unsigned long time = ULONG_MAX )
    bool
    wait ( QReadWriteLock * readWriteLock, unsigned long time = ULONG_MAX )
    void
    void
    详细描述:
    该类允许一个线程来告诉其他线程一些种情况已经被遇到。一个或者多个线程能阻塞等待为一个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和等待waitConditionMutex必须被调用的线程原始锁定。如果mutex不是在一个锁定的状态,这个函数立即返回。如果mutex是一个递归的mutex,这个函数立即返回。Mutex将被解锁,调用线程将阻塞直到这些情况被遇到:
    1.     另一个线程用wakeOne()或者wakeAll()发射信号。这个函数将返回true
    2.     time超时。如果timeulong_max(默认的),然后等待将绝不超时。这个函数将返回false,如果等待超时

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

    void QWaitCondition::wakeAll ()

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

    void QWaitCondition::wakeOne ()

    唤醒一个线程,等待waitCondition的。线程的唤醒取决于操作系统的政策,不能被控制。
    如果你想唤醒一个特别的线程,解决办法是使用不同的等待情况。
     
    http://no001.blog.51cto.com/1142339/277010
  • 相关阅读:
    redis 集群目标、集群查看、配置方法及过程、哨兵配置启动
    redis 事务、Jedis事务处理流程
    redis订阅与发布(把redis作为消息中间件)
    redis 管道技术 pipeline 简介
    redis 适用场景、缓存选择、java实现
    redis 数据淘汰策略与配置
    redis 持久化策略、aof配置、测试、手动持久化、aof文件体积优化
    redis 命令行查看修改配置文件项、配置文件说明
    redis HyperLogLog 基数估算
    redis 命令select、dbsize、清空数据库、info、client
  • 原文地址:https://www.cnblogs.com/findumars/p/7487892.html
Copyright © 2011-2022 走看看