Qt生产者消费者实验:等待条件QWaitCondition
来源:互联网 发布:精易编程助手 下载 编辑:程序博客网 时间:2024/06/06 02:34
分类: LINUX 2012-08-12 16:42 829人阅读 评论(1)收藏 举报
qtbufferclass
- /*
- 使用QWaitCondition和QMutex可以实现比信号量更精确的控制
- */
- #include <QtCore>
- #include <iostream>
- //const int DataSize = 100000;
- //const int BufferSize = 4096;
- const int DataSize = 100;
- const int BufferSize = 100;
- char buffer[BufferSize];
- //与信号量不同的程序
- QWaitCondition bufferIsNotFull; //QWaitCondition允许在一定条件下触发其它多个线程
- QWaitCondition bufferIsNotEmpty;
- QMutex mutex;
- int usedSpace = 0;//不是信号量,而是用来代表在缓冲器中存在多少个“用过的”字节
- //生产者
- class Producer : public QThread
- {
- public:
- void run();
- };
- void Producer::run()
- {
- for (int i = 0; i < DataSize; ++i) {
- mutex.lock();//锁定:保护对usedSpace变量的访问
- //如果缓冲区都是用过的字节,那么就等待
- while (usedSpace == BufferSize)
- bufferIsNotFull.wait(&mutex);//wait的过程:解锁->阻塞当前线程->满足条件->锁定->返回
- buffer[i % BufferSize] = "ACGT"[uint(rand()) % 4];
- std::cerr<<"P";//代表一次生产者线程的运行
- ++usedSpace;
- bufferIsNotEmpty.wakeAll();//Wakes all threads waiting on the wait condition.
- mutex.unlock();//解锁
- }
- }
- //消费者
- class Consumer : public QThread
- {
- public:
- void run();
- };
- void Consumer::run()
- {
- for (int i = 0; i < DataSize; ++i) {
- mutex.lock();//
- //如果缓冲区里“用过的”字节数目为0,则等待
- while (usedSpace == 0)
- bufferIsNotEmpty.wait(&mutex);
- //std::cerr << buffer[i % BufferSize];
- char Cons = buffer[i % BufferSize];
- std::cerr<<"c";
- --usedSpace;
- bufferIsNotFull.wakeAll();
- mutex.unlock();
- }
- std::cerr << std::endl;
- }
- int main()
- {
- Producer producer;
- Consumer consumer;
- producer.start();
- consumer.start();
- producer.wait();
- consumer.wait();
- return 0;
- }
/*使用QWaitCondition和QMutex可以实现比信号量更精确的控制*/#include <QtCore>#include <iostream>//const int DataSize = 100000;//const int BufferSize = 4096;const int DataSize = 100;const int BufferSize = 100;char buffer[BufferSize];//与信号量不同的程序QWaitCondition bufferIsNotFull; //QWaitCondition允许在一定条件下触发其它多个线程QWaitCondition bufferIsNotEmpty;QMutex mutex;int usedSpace = 0;//不是信号量,而是用来代表在缓冲器中存在多少个“用过的”字节//生产者class Producer : public QThread{public: void run();};void Producer::run(){ for (int i = 0; i < DataSize; ++i) { mutex.lock();//锁定:保护对usedSpace变量的访问 //如果缓冲区都是用过的字节,那么就等待 while (usedSpace == BufferSize) bufferIsNotFull.wait(&mutex);//wait的过程:解锁->阻塞当前线程->满足条件->锁定->返回 buffer[i % BufferSize] = "ACGT"[uint(rand()) % 4]; std::cerr<<"P";//代表一次生产者线程的运行 ++usedSpace; bufferIsNotEmpty.wakeAll();//Wakes all threads waiting on the wait condition. mutex.unlock();//解锁 }}//消费者class Consumer : public QThread{public: void run();};void Consumer::run(){ for (int i = 0; i < DataSize; ++i) { mutex.lock();// //如果缓冲区里“用过的”字节数目为0,则等待 while (usedSpace == 0) bufferIsNotEmpty.wait(&mutex); //std::cerr << buffer[i % BufferSize]; char Cons = buffer[i % BufferSize]; std::cerr<<"c"; --usedSpace; bufferIsNotFull.wakeAll(); mutex.unlock(); } std::cerr << std::endl;}int main(){ Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return 0;}
(1)
- const int DataSize = 100;
- const int BufferSize = 1;
const int DataSize = 100;const int BufferSize = 1;PcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPc
(2)
- const int DataSize = 100;
- const int BufferSize = 10;
const int DataSize = 100;const int BufferSize = 10;结果1
PPPPPPPPPPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcccccccccc
结果2
PPPPPPPPPPcPcPcPcPcPcPcPcPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPcc
结果3
PPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPcccccccccc
(3)
- const int DataSize = 100;
- const int BufferSize = 100;
const int DataSize = 100;const int BufferSize = 100;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
- Qt生产者消费者实验:等待条件QWaitCondition
- Qt生产者消费者实验:等待条件QWaitCondition
- Qt生产者消费者实验(2):等待条件QWaitCondition
- Qt生产者消费者实验(2):等待条件QWaitCondition
- Qt生产者消费者实验(2):等待条件QWaitCondition
- Qt之线程同步(生产者消费者模式 - QWaitCondition)
- Qt生产者消费者实验(1):信号量
- Qt生产者消费者实验(1):信号量
- 线程使用之条件等待模拟生产者消费者
- “生产者-消费者”实验
- 【Qt多线程之线程的等待和唤醒】QWaitCondition
- 线程实现生产者消费者实验
- Java等待/通知机制:生产者-消费者问题
- 多生产者和多消费者等待唤醒
- 生产者和消费者之等待唤醒机制
- 多线程-生产者消费者之等待唤醒机制
- Boost, C++11,生产者消费者以及Qt生产者消费者例子
- python 条件变量 生产者与消费者
- 我的心情
- MTK boot.img recover.img 解压和压缩工具下载地址
- 谈大同世界
- lspci
- 使用SimpleCursorAdapter
- Qt生产者消费者实验:等待条件QWaitCondition
- [沧海拾遗]applet本地web开发例子
- android 异步处理
- Struts2与Servlet的关系
- char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][], and so on
- Qt多线程 .
- Android中ListView分页加载数据
- android笔记--在ListView中显示图片及ListView的动态刷新
- iOS多线程编程指南(三)Run Loop