Qt信号量QSemaphore(在线程里使用,结合生产者消费者的问题)
2024-08-31 23:19:33
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个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
最新文章
- Atitit 游戏的原理与概论attilax总结
- 【VS】vs修改大小写快捷键
- [原创]Centos7 从零编译Nginx+PHP+MySql
- PHP导出数据到Excel
- 关于【bootstrap modal 模态框弹出瞬间消失的问题】
- Escape Sequences in String
- 应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
- stm32之CAN发送、接收详解
- 如何设置ubuntu自己主动的睡眠时间
- (简单) POJ 3468 A Simple Problem with Integers , 线段树+区间更新。
- WLAN高密无线网络部署的信道问题
- jemter+ant+jenkins进行集成测试
- python3 re模块
- HTML 中使用 JavaScript
- https创建请求UrL报错: 未能为 SSL/TLS 安全通道建立信任关系
- MATLAB——线性神经网络
- xss攻击问题以及如何防范
- 201621123018《Java程序设计》第10周学习报告
- Java 正则表达式(精华)
- Linux基础命令---mknod
热门文章
- springboot内置tomcat验证授权回调页面域名
- win7(64位)彻底卸载mysql,重装不再烦恼
- win7 UAC bypass(微软已经给予了三组组件绕过UAC启动的特权)
- SQLyog 报错2058 :连接 mysql 8.0.12 解决方法
- atitit.提高开发效率---mda 革命性的软件开发方法
- R 语言基本操作(基本信息的查看、与本地文件系统交互、编译器版本升级)
- Android Handler、Message完全解析,带你从源码的角度彻底理解
- 随机森林与 GBDT
- python3操作注册表设置/取消IE代理
- blockchain_eth客户端安装 &; geth使用 &;批量转账(一)