qt信号量理解及使用
信号量可以理解为互斥量的延伸或者说是互斥量的泛化,一个互斥量只能锁一次,但信号量则可以获取多次,信号量经常在多线程或多进程中用来保护一定数量的共享资源,线程必须要获取一个信号量,举个例子:
有一个餐馆,里面有十个位置, 最初都是空的,这个时候如果进来十二个人,则看门人仅允许十个人进入,然后锁上门,剩下的二个人则必须在大门等待,此后来的所有的顾客也不得不在门口等待,这时如果里面有个人吃完饭离开了,则看门人打开大门,外面的一个人可以进来,如果又有五个人走了,则又可以放外面的五个人进来。在这个例子中,餐馆中的座位是共享资源,而看门人起到了信号量的作用,进去吃饭的人就是一个线程。
在qt中,QSemaphore类代表信号量,他主要有两个基本的操作acquire()和release():acquire()获取资源,如果没有可用的共享资源,则调用该信号量的线程将会阻塞,直到有可以利用的资源为止,release()用来释放资源(调用该接口后,资源数量将会+1)。
const int dataSize = 1000;
const int buffersize = 800;
char buffer[buffersize];
QSemaphore smt_free(buffersize);
QSemaphore smt_used;
//生产者
class CProduce:public QThread
{Q_OBJECT
public:CProduce(QObject* parent = nullptr){};~CProduce(){};
public:void run()override{for (int i = 0; i < dataSize;++i){smt_free.acquire();buffer[i%buffersize] = "ACGR"[(int)(qrand())/4];smt_used.release();}};
}//消费者
class CConsume:public QThread
{Q_OBJECT
public:CConsume(QObject* parent = nullptr){};CConsume(){};
public:void run()override{for (int i = 0; i < dataSize;++i){smt_used.acquire();fprintf(stderr,"%c",buffer[i%buffersize]);smt_free.release();}};
}int main(int argc,char*argv[])
{QCoreApplication a(argc,argv);CProduce produce;CConsume consume;produce.start();consume.start();produce.wait();consume.wait();return a.exec();
}
qt信号量理解及使用相关推荐
- Qt 信号量 QSemaphore Class 的翻译
关于 Qt QSemaphore class 的翻译 Qt 的 QSemaphore class 提供了一个通用的信号量(可以是单一的,也可以是数量多个的)的使用方法. 需要编辑环境添加: Heade ...
- Qt::WA_OpaquePaintEvent理解
Qt助手中对Qt::WA_OpaquePaintEvent解释如下: Indicates that the widget paints all its pixels when it receives ...
- Qt httpserver 理解与使用
目录 概述 核心概念-路由 多线程处理 Qt Https Server 概述 Qt提供了创建简单web服务器的拓展模块,即qthttpserver 关于该模块的一些信息: Introducing th ...
- 信息熵和交叉熵的细节理解
先陈述我这里说了半天的信息熵是个什么东西? 这里说的信息熵是什么东西? 信息熵主要是应用在集成学习作为评价指标,判定我们某次的分类是不是效果足够好. 这里说的交叉熵是什么东西? 虽然之前还有其他应用, ...
- Linux学习之系统编程篇:信号量(sem_init / wait / trywait / post / destroy)
一.信号量的初步认识 可以把信号量理解为加强版的互斥锁 对于互斥锁: pthread_mutex_init () 初始化 一把互斥锁后 :mutex = 1 ,代表有一把互斥锁可用. pthread_ ...
- Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总
Qt::WindowType标志通过如下函数设置: setWindowFlag 或 setWindowFlags 注意:这两个函数的区别是:不加s的每次只能设置一个Qt::WindowType标志位, ...
- qtabwidget放大_Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)...
写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...
- Qt网络编程:QNetworkProxy
一.描述 QNetworkProxy 提供了为 Qt 网络类配置网络层代理支持的方法.当前支持的类有 QAbstractSocket.QTcpSocket.QUdpSocket.QTcpServer. ...
- 常见的锁策略、synchronized中的锁优化机制
一.常见的锁策略 锁策略,和普通程序猿基本没啥关系,和 "实现锁" 的人才有关系的 这里所提到的锁策略,和 Java 本身没关系,适用于所有和 "锁" 相关的情 ...
最新文章
- 无法使用_解决kali linux 2020 安装完后发现无法使用 ifconfig
- 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细
- 如何不屏蔽Android系统的返回按键
- winform groupbox控件放到窗体中间位置
- 如何转移主机之间Docker镜像
- 操作系统死机的12个问题
- linux那些事之page cache
- python决策树分类 导入数据集_BPNN、决策树、KNN、SVM分类鸢尾花数据集Python实现...
- BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
- watch the fixed address in qt
- python的库有哪些餐厅_Python告诉你上海有哪些高性价比的西餐厅
- JFinal一行代码搞定增删改,要的就是快
- Flutter尝鲜:跨平台移动应用开发
- 《代码大全》读书笔记(转载)
- 斗鱼扩展--移除广告优化页面(五)
- 7.Numpy array 分割(纵向分割/横向分割/错误分割/不等量分割/其他分割)
- 4.2.7-packet-tracer---configure-router-on-a-stick-inter-vlan-routing
- (jsp一)概述及服务器配置
- 如何从无到有设计一款字体
- I06-python菜鸟教程查漏补缺