Qt信号量QSemaphore
2016-01-07 14:55
495 查看
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
当DataSize = 100, BufferSize = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
![](http://pic002.cnblogs.com/images/2012/373143/2012101520043589.png)
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
![](http://pic002.cnblogs.com/images/2012/373143/2012101520070829.png)
情况之二:
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个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时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
![](http://pic002.cnblogs.com/images/2012/373143/2012101520043589.png)
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
![](http://pic002.cnblogs.com/images/2012/373143/2012101520070829.png)
情况之二:
![](http://pic002.cnblogs.com/images/2012/373143/2012101520091585.png)
相关文章推荐
- qt tableview
- QThread定时器
- Qt 事件系统
- qt鼠标事件使用
- x11 gtk qt gnome kde 之间的区别和联系 .
- QT xml转ini的实现(从C#转到QT)
- VS2015集成QT5.6.0
- QT生成可执行的EXE程序
- qt 绘图
- 用QT获取本机IP
- qt新手工程
- Qt扫雷游戏
- QT学习资源
- QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)
- QT学习 之 QwtPlot(数学绘图)
- Qt Installer Framework的学习(三)
- Qt中的对象类型转换(Qstring 转换char*有三种方法)
- Qt 学习 之 二进制文件读写
- QT学习 之 文本文件读写
- Qt学习 之 文件