Qt信号量QSemaphore(在线程里使用,结合生产者消费者的问题)
2016-07-22 19:52
591 查看
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
当DataSize = 100, BufferSize = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
http://www.cnblogs.com/venow/archive/2012/10/15/2724943.html
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个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时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
http://www.cnblogs.com/venow/archive/2012/10/15/2724943.html
相关文章推荐
- 从零开始移植QT4.8.5之一--在windows下安装QT
- Qt中基于QGraphicsItem类的重载鼠标事件函数的教训
- qt 之 QFileSystemModel
- 分享一点在用Qt编写计算器的过程中所遇到的问题(主要是信号和槽的问题)大神们就没必要看了,都是一些小白摸爬打滚的经验
- qt 之 QPushbutton
- Qt之资源系统
- Qt之资源系统
- Qt之资源系统
- 实习项目——基于Qt5的银行排号叫号系统(客户端)
- Qt之加载QSS文件
- Qt之加载QSS文件
- Qt之加载QSS文件
- Ubuntu使用集成开发环境QT无法输入中文的解决方法
- 开源MQTT消息服务器
- Qt之QSS(白色靓丽)
- Qt之QSS(白色靓丽)
- Qt之QSS(白色靓丽)
- Qt之QSS(黑色炫酷)
- Qt之QSS(黑色炫酷)
- Qt之QSS(黑色炫酷)