【Qt多线程之信号量】Qsemaphore
来源:互联网 发布:淘宝会员卡怎么设置 编辑:程序博客网 时间:2024/04/29 14:05
信号量
怎么简单的给自己解释这个机制呢?
那就借这个小代码解释吧
QSemaphore freeBytes(80);QSemaphore usedBytes(0);freeBytes.acquire();buffer[i%BufferSize] = (i%BufferSize);usedBytes.release();
freeBytes(80)表示信号量中的可用资源是80,而每次freeBytes.acquire()都会让可用资源-1,直到可用资源=0时,这时候就会引发阻塞;
另一方面可以通过usedBytes.release()来释放资源,每次release()都会让可用资源+1,这时候又有可用资源了,阻塞的地方也就再次开始运行了。
实例
经典的信号量说明机制:生产者和消费者
semaphore.h
#ifndef SEMAPHORE_H#define SEMAPHORE_H#include <QSemaphore>#include <QThread>class Producer : public QThread{public: Producer(); void run();};class Consumer : public QThread{public: Consumer(); void run();};#endif
semaphore.cpp
#include "semaphore.h"#include <QtDebug>const int DataSize = 1000;const int BufferSize = 80;int buffer[BufferSize];QSemaphore freeBytes(BufferSize);QSemaphore usedBytes(0);/********消费者**********************************************/Consumer::Consumer(){}void Consumer::run(){ usedBytes.acquire(); for (int i = 0; i < DataSize; i++) { usedBytes.acquire(); qDebug() << buffer[i%BufferSize]; if (i % 16 == 0 && i != 0) qDebug() << "\n"; freeBytes.release(); }}/********生产者**********************************************/Producer::Producer(){}void Producer::run(){ for (int i = 0; i < DataSize; i++) { freeBytes.acquire(); buffer[i%BufferSize] = (i%BufferSize); usedBytes.release(); //每次读入一个数,告知消费者可以读数了 }}
main.cpp
//Application这个类是继承QCoreApplication的,而QCoreApplication有继承//QObject的,而QObject就是QT中最基本的基类,也就是QT的根基了,//.acquire() 每使用一次,引用计数-1//.release() 每使用一次,引用计数+1#include <QCoreApplication>#include "semaphore.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); Producer p; Consumer c; p.start(); c.start(); p.wait(); c.wait(); return a.exec();}
0 0
- 【Qt多线程之信号量】Qsemaphore
- Qt信号量QSemaphore
- Qt信号量QSemaphore
- Qt信号量QSemaphore
- Qt信号量QSemaphore
- QSemaphore----Qt信号量
- QT之使用QSemaphore信号量同步线程小例子
- Qt的QWaitCondition、信号量QSemaphore
- QT——QSemaphore(信号量)
- QSemaphore 信号量
- Qt多线程编程(3)——QSemaphore的使用
- Qt之线程同步(生产者消费者模式 - QSemaphore)
- QT的qsemaphore编程
- QT QSemaphore 线程同步
- Qt多线程基础(二)线程同步之信号量
- Qt多线程编程一:使用QSemaphore和waitCondition管理一系列资源
- C#多线程之信号量
- 多线程编程之信号量
- listView添加动画
- LeetCode Serialize and Deserialize Binary Tree
- 解决maven与eclipse中@override出现must override a superclass method错误
- Mybatis to_date方法(ORACLE)
- 第七讲流程图
- 【Qt多线程之信号量】Qsemaphore
- 协同过滤算法-slope one
- python文件的整体结构
- TBS调试手机QQ浏览器
- 贪心
- C++【类与访控属性】
- java的System.getProperty()方法可以获取的值
- java.lang.NoClassDefFoundError:weblogic/server
- HTTP通信过程原理