博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt的QWaitCondition
阅读量:7110 次
发布时间:2019-06-28

本文共 1421 字,大约阅读时间需要 4 分钟。

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

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

#include 
#include
#include
#include
#include
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<

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

                       

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

  情况之一:

                       

  情况之二:

                       

转载地址:http://qblhl.baihongyu.com/

你可能感兴趣的文章
python 异步采集,网页爬虫编写 | 一步一步学python
查看>>
Flash调用XML文件的方法
查看>>
Android ArrayAdapter 详解
查看>>
【iOS开发笔记26/50】我自己写的苹果应用程序XQViewer终于上架了,解决了一系列的问题,终于挺过来了...
查看>>
JSF---->其他标签
查看>>
Python应用01 原始Python服务器
查看>>
Add Console Application Program to the MFC Program
查看>>
Oracle中可被并行化执行的SQL操作
查看>>
新的Layout布局系统
查看>>
java链表
查看>>
VC获取操作系统版本和名称
查看>>
iOS: 消息通信中的Notification&KVO
查看>>
FZU Problem 2105 Digits Count
查看>>
禁止复制
查看>>
Accessing Hardware in Silverlight using COM
查看>>
工具箱 - Xshell <2>
查看>>
使用bootstrap和metroui设计的微网站或手机app界面
查看>>
使用GLSL实现更多数量的局部光照 【转】
查看>>
Linux下使用popen()执行shell命令
查看>>
可压Navier-Stokes方程组的爆破现象
查看>>