qt 信号连接信号_Qt之多线程同步信号量

本文介绍了如何在Qt中使用QSemaphore进行线程同步,通过双缓冲区数据采集的例子展示了如何在数据采集线程(QThreadDAQ)和数据读取线程(QThreadShow)之间协调操作,确保数据不丢失。
摘要由CSDN通过智能技术生成

点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达

想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获

基于信号量的线程同步

1.信号量的原理

信号量(Semaphore)是另一种限制对共享资源进行访问的线程同步机制,它与互斥量(Mutex)相似,但是有区别。一个互斥量只能被锁定一次,而信号量可以多次使用。信号量通常用来保护一定数量的相同的资源,如数据采集时的双缓冲区。

    QSemaphore是实现信号量功能的类,它提供以下几个基本的函数:

  • acquire(int n)尝试获得n个资源。如果没有这么多资源,线程将阻塞直到有n个资源可用;

  • release(int n)释放n个资源,如果信号量的资源全部可用之后再release(),就可以创建更多的资源,增加可用资源的个数:

  • int available()返回当前信号量可用的资源个数,这个数永远不可能为负数,如果为0,就说明当前没有资源可用;

  • bool tryAcquire(int n=1),尝试获取n个资源,不成功时不阻塞线程。

定义QSemaphore的实例时,可以传递一个数值作为初始可用的资源个数。

下面的一段示意代码,说明QSemaphore的几个函数的作用。

QSemaphore WC(5);// WC.available() == 5,初始资源个数为5个WC.acquire(4);// WC.available() == 1,用了 4个资源,还剰余1个可用WC.release(2);// WC.available()= 3,释放了 2个资源,剩余3个可用WC.acquire(3);// WC.available()== 0,又用了 3个资源,剩余0个可用WC.tryAcquire(1);//因为 WC.available()== 0,返回 false.WC.acquire();//因为WC.available()== 0,没有资源可用,阻塞

为了理解信号量及上面这段代码的意义,可以假想变量WC是一个公共卫生间,初始化时定义WC有5个位置可用。

  • WC.acquire(4),成功进去4个人,占用了 4个位置,还剩余1个位置:

  • WC.release(2),出来了 2个人,剩余3个位置可用:

  • WC.acquire(3),又进去3个人,剩余0个位置可用;

  • WC.tryAcquire(1),有一个人尝试进去,但是因为没有位置了,他不等待,走了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值