信号量可以理解为互斥量的延伸或者说是互斥量的泛化,一个互斥量只能锁一次,但信号量则可以获取多次,信号量经常在多线程或多进程中用来保护一定数量的共享资源,线程必须要获取一个信号量,举个例子:
有一个餐馆,里面有十个位置, 最初都是空的,这个时候如果进来十二个人,则看门人仅允许十个人进入,然后锁上门,剩下的二个人则必须在大门等待,此后来的所有的顾客也不得不在门口等待,这时如果里面有个人吃完饭离开了,则看门人打开大门,外面的一个人可以进来,如果又有五个人走了,则又可以放外面的五个人进来。在这个例子中,餐馆中的座位是共享资源,而看门人起到了信号量的作用,进去吃饭的人就是一个线程。
        在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信号量理解及使用相关推荐

  1. Qt 信号量 QSemaphore Class 的翻译

    关于 Qt QSemaphore class 的翻译 Qt 的 QSemaphore class 提供了一个通用的信号量(可以是单一的,也可以是数量多个的)的使用方法. 需要编辑环境添加: Heade ...

  2. Qt::WA_OpaquePaintEvent理解

    Qt助手中对Qt::WA_OpaquePaintEvent解释如下: Indicates that the widget paints all its pixels when it receives ...

  3. Qt httpserver 理解与使用

    目录 概述 核心概念-路由 多线程处理 Qt Https Server 概述 Qt提供了创建简单web服务器的拓展模块,即qthttpserver 关于该模块的一些信息: Introducing th ...

  4. 信息熵和交叉熵的细节理解

    先陈述我这里说了半天的信息熵是个什么东西? 这里说的信息熵是什么东西? 信息熵主要是应用在集成学习作为评价指标,判定我们某次的分类是不是效果足够好. 这里说的交叉熵是什么东西? 虽然之前还有其他应用, ...

  5. Linux学习之系统编程篇:信号量(sem_init / wait / trywait / post / destroy)

    一.信号量的初步认识 可以把信号量理解为加强版的互斥锁 对于互斥锁: pthread_mutex_init () 初始化 一把互斥锁后 :mutex = 1 ,代表有一把互斥锁可用. pthread_ ...

  6. Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总

    Qt::WindowType标志通过如下函数设置: setWindowFlag 或 setWindowFlags 注意:这两个函数的区别是:不加s的每次只能设置一个Qt::WindowType标志位, ...

  7. qtabwidget放大_Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)...

    写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...

  8. Qt网络编程:QNetworkProxy

    一.描述 QNetworkProxy 提供了为 Qt 网络类配置网络层代理支持的方法.当前支持的类有 QAbstractSocket.QTcpSocket.QUdpSocket.QTcpServer. ...

  9. 常见的锁策略、synchronized中的锁优化机制

    一.常见的锁策略 锁策略,和普通程序猿基本没啥关系,和 "实现锁" 的人才有关系的 这里所提到的锁策略,和 Java 本身没关系,适用于所有和 "锁" 相关的情 ...

最新文章

  1. 无法使用_解决kali linux 2020 安装完后发现无法使用 ifconfig
  2. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细
  3. 如何不屏蔽Android系统的返回按键
  4. winform groupbox控件放到窗体中间位置
  5. 如何转移主机之间Docker镜像
  6. 操作系统死机的12个问题
  7. linux那些事之page cache
  8. python决策树分类 导入数据集_BPNN、决策树、KNN、SVM分类鸢尾花数据集Python实现...
  9. BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
  10. watch the fixed address in qt
  11. python的库有哪些餐厅_Python告诉你上海有哪些高性价比的西餐厅
  12. JFinal一行代码搞定增删改,要的就是快
  13. Flutter尝鲜:跨平台移动应用开发
  14. 《代码大全》读书笔记(转载)
  15. 斗鱼扩展--移除广告优化页面(五)
  16. 7.Numpy array 分割(纵向分割/横向分割/错误分割/不等量分割/其他分割)
  17. 4.2.7-packet-tracer---configure-router-on-a-stick-inter-vlan-routing
  18. (jsp一)概述及服务器配置
  19. 如何从无到有设计一款字体
  20. I06-python菜鸟教程查漏补缺

热门文章

  1. 数据在内存中如何存储?
  2. 二进制、八进制、十进制、十六进制之间转换
  3. Java:时间戳转换成时间
  4. jsp中插入图片无法显示
  5. 软件测试缺陷等级划分_测试缺陷等级表
  6. javascript UniqueID属性
  7. 设计 Pastebin.com (或者 Bit.ly)
  8. 信用卡逾期多少天会成为黑户?
  9. 2023年“华数杯”国际大学生数学建模A题赛题发布
  10. 一步一步理解大模型:模型组合简介