Qt信号量QSemaphore
2014-04-10 15:15
387 查看
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
当DataSize = 100, BufferSize = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
#include <QtCore/QCoreApplication> #include <QSemaphore> #include <QThread> #include <iostream> #include <QTime> const int DataSize = 100; const int BufferSize = 1; char buffer[BufferSize]; QSemaphore freeSpace(BufferSize); QSemaphore usedSpace(0); class Producer : public QThread { protected: void run() { qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); qsrand(NULL); for (int i = 0; i < DataSize; ++i) { freeSpace.acquire(); std::cerr<<"P"; usedSpace.release(); } } }; class Consumer : public QThread { protected: void run() { for (int i = 0; i < DataSize; ++i) { usedSpace.acquire(); std::cerr<<"C"; freeSpace.release(); } 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时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
相关文章推荐
- Qt的QWaitCondition
- 基于Qt的QZXing源码的Mac osx编译
- QTableView派生类重载dropEvent方法无效的解决办法
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- QT里定时器QTimer的用法
- 【转】QT#include <GL/gl.h>错误解决办法
- QT 读写sqllite数据库
- Qt学习笔记常用容器
- Qt5 新特性
- QT 的信号与槽机制介绍
- Qt学习笔记常用容器
- 【亲测可用】Qt4.8.5+QtCreator2.8.0傻瓜安装...
- qt超强绘图控件qwt - 安装及配置
- 如何在QTP中添加和使用环境变量(1)
- Qt5官方demo解析集9——Analog Clock Window Example
- QT生成DLL,调用DLL
- QTextEdit的段落排版
- 【Qt】遇到的问题
- 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示
- 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示