Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)

摘要:
生产者和消费者问题的另一个解决方案是使用QWaitCondition,它允许线程在特定条件下唤醒其他线程。wakeOne()函数在满足条件时随机唤醒一个等待线程,而wakeAll()函数则在满足条件后唤醒所有等待线程。下面是一个典型的用例:生产者和消费者实现它们之间的同步。整个项目是一个main.cpp。文件如下:#include#include#include#include#includeconstantDataSize=100;constantBufferSize=1;charbuffer[BufferSize];Q等待条件缓冲区未满;QWaitConditionbufferIsNotEmpty;QMutexmutex;直觉空间;classProducer:publicQThread{protected:voidrun(){for{mutex.lock();while{bufferIsNotFull.wait;}std::cerr˂˂“P”;++使用空间;bufferIsNotEmpty.wakeAll();互斥锁解锁();}};classConsumer:publicQThread{protected:voidrun(){for{mutex.lock();while{bufferIsNotEmpty.wait;}std::cerr˂˂“C”;--使用空间;bufferIsNotFull.wakeAll();互斥锁解锁();}std::cerr˂˂std::endl;}};Intmain{Producerproducer;Consumerconsumer;producer start();consumer.start();producer wait();consumer.wait());return0;}当DataSize=100,BufferSize=1时,程序的接口如下,结果是可预测的。当DataSize=100和BufferSize=10时,程序的接口如下,结果出乎意料。这里只有两个案例。

  对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程。其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件满足时唤醒所有等待线程。

  下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:

复制代码
#include <QtCore/QCoreApplication>
#include <QWaitCondition>
#include <QThread>
#include <QMutex>
#include <iostream>

const int DataSize = 100;
const int BufferSize = 1;
char buffer[BufferSize];

QWaitCondition bufferIsNotFull;
QWaitCondition bufferIsNotEmpty;
QMutex mutex;
int usedSpace;

class Producer : public QThread
{
protected:
    void run()
    {
        for (int i = 0; i < DataSize; ++i)
        {
            mutex.lock();
            while (usedSpace == BufferSize)
            {
                bufferIsNotFull.wait(&mutex);
            }
            std::cerr<<"P";
            ++usedSpace;
            bufferIsNotEmpty.wakeAll();
            mutex.unlock();
        }
    }
};

class Consumer : public QThread
{
protected:
    void run()
    {
        for (int i = 0; i < DataSize; ++i)
        {
            mutex.lock();
            while (usedSpace == 0)
            {
                bufferIsNotEmpty.wait(&mutex);
            }
            std::cerr<<"C";
            --usedSpace;
            bufferIsNotFull.wakeAll();
            mutex.unlock();
        }
        std::cerr<<std::endl;
    }
};

int main(int argc, char *argv[])
{
   Producer producer;
   Consumer consumer;
   producer.start();
   consumer.start();
   producer.wait();
   consumer.wait();
return 0;
}
复制代码

  当DataSize = 100, BufferSize  = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。   

                       Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)第3张

  当DataSize = 100, BufferSize  = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。

  情况之一:

                       Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)第4张

  情况之二:

                       Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)第5张

 
http://www.cnblogs.com/venow/archive/2012/10/15/2725040.html

免责声明:文章转载自《Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP脚本执行超时的解决办法前端工程师必备实用网站下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

AQS与重入锁ReetrantLock原理

一、AQS原理 AQS(AbstractQueuedSynchronizer)队列同步器是用来构建锁、同步组件的基础框架。 AQS内部通过一个volatile int类型的成员变量state控制同步状态【0代表锁未被占用,1表示已占用】,通过内部类Node构成FIFO的同步队列实现等待获取锁的线程排队工作,通过内部类ConditionObject构建条件等...

多线程抢票系统浅析

笔者打算写个轻量版的秒杀系统,那么需要多线程模拟客户去抢购某个商品。故有想先写一个简单的多线程抢票系统加深一下对线程池,同步的理解。 1. 新建Java project,命名为ClientApp1, src文件夹里面新建demo文件夹。 项目结构如下,     2. 程序模拟的场景用例如下, 多个线程模拟多个客户去购买春运车票 每个客户购买车票【0,9】...

Jmeter核心-慧测课堂笔记

自动化测试平台-Httprunner-接口、UI、协议。 平台语言-JAVA-UI-Selenium(java版的)、Appium(java版的)、接口-Httpclient、Jmeter。(Jmeter性能测试工具,可以做接口自动化,java写的。) 平台语言-Python-locust(接口、性能)。 linux下载tgz格式的,windows下载gp...

notify()和notifyAll()有什么区别?

先解释两个概念。 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁。 锁池:只有获取了对象的锁,线程才能执行对象的 synchronized 代码,对象的锁每次只有一个线程可以获得,其他线程只能在锁池中等待 区别: notify() 方法随机唤醒对象的等待池中...

到底是什么原因导致我的进程崩溃?

当你你有1000个w3wp.exe文件在eventviewer中意外停止,或者您的进程以某种奇怪的未定义方式退出,您不知道原因。当一个进程崩溃或退出时,将触发一个称为EPR(Exit process)的特殊事件,因此使用类似于windbg.exe文件我们可以附加到进程中,等待epr被抛出,然后进行内存转储。安装windows调试工具时,会得到一个名为adp...

Linux下MySQL所在磁盘,线程,内存的配置

磁盘日志策略 /etc/fstab中可以进行正面的配置(其性能按从上到下的顺序排列) data=writeback 只有元数据写入日志.元数据写入与数据写入并不同步.这是最快的配置,对innodb来说通常是安全的,innodb有自己的事务日志.唯一例外是当系统崩溃.frm文件损坏了. data=ordered 这个选项也只会记录元数据,但是会提供一些一致性...