Qt生产者消费者实验:等待条件QWaitCondition
2016-03-30 14:17
531 查看
转自:点击打开链接
执行结果:
(1)
[cpp] view
plain copy
print?
const int DataSize = 100;
const int BufferSize = 1;
PcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPc
(2)
[cpp] view
plain copy
print?
const int DataSize = 100;
const int BufferSize = 10;
结果1
PPPPPPPPPPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcccccccccc
结果2
PPPPPPPPPPcPcPcPcPcPcPcPcPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPcc
结果3
PPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPcccccccccc
(3)
[cpp] view
plain copy
print?
const int DataSize = 100;
const int BufferSize = 100;
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
/* 使用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)
[cpp] view
plain copy
print?
const int DataSize = 100;
const int BufferSize = 1;
PcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPc
(2)
[cpp] view
plain copy
print?
const int DataSize = 100;
const int BufferSize = 10;
结果1
PPPPPPPPPPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcccccccccc
结果2
PPPPPPPPPPcPcPcPcPcPcPcPcPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPcc
结果3
PPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPccccccccccPPPPPPPPPPcccccccccc
(3)
[cpp] view
plain copy
print?
const int DataSize = 100;
const int BufferSize = 100;
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
相关文章推荐
- Qt编程思路困惑1
- Arm开发板+Qt学习之路
- Qt 学习之路 2(38):存储容器
- Jetson TK1开发环境搭建(五)编译Qt 5.5.1 Qt Creator3.6.0
- Jetson TK1开发环境搭建(四)编译Qt 5.5.1
- Qt13 Creating connection open and close function with sqlite database
- QT12 How to open a new window after successful Login
- QT11 How to set image with QLabel in Qt
- QT 简单编写贪吃蛇
- QT7 How to connect Qt to SQLite
- Qt提取EXE文件的大图标
- 关于QT5 Failed to find or load platform plugin "windows" 问题
- QT隐藏鼠标
- Qt编译qsqlmysql.dll插件
- qt5.5.1的程序发布方法
- 在Ubuntu 10.04中文版下Qt编程,使用unixODBC和FreeTDS连接MS SQL Server 2005,并且中文不出现乱码的方法
- Qt自定义委托在QTableView中绘制控件、图片、文字(内容比较全)
- 跨平台开发之qt及开源组件qml material
- 分治——sqtx
- QT5读取中文乱码问题