当前位置: 首页 > news >正文

项目1:队列的讲解(下):C++多线程队列使用

一.多线程队列的框图:

该图展示了典型的多线程队列操作流程。系统需要创建两个独立线程:一个负责入队操作,另一个负责出队操作。入队线程通过调用push API将数据添加到队列尾部,并在每次插入操作后通过pthread_cond_broadcast发出唤醒信号。与此同时,出队线程处于等待状态(pthread_cond_wait),一旦收到入队线程的唤醒通知,便会立即执行数据出队操作。

二.Linux多线程的基本API

2.1. pthread_mutex_lock

int pthread_mutex_lock(pthread_mutex_t *mutex);

第一个传入参数:pthread_mutex_t结构体指针

功能:这个是互斥锁加锁功能,就是每次线程调用的时候都会把锁加上,使其保证访问数据的原子性,直到解锁为止。

2.2. pthread_mutex_unlock: 

int pthread_mutex_unlock(pthread_mutex_t *mutex);

第一个传入参数:pthread_mutex_t结构体指针

功能:这个是互斥锁解锁功能,就是每次线程访问完资源的时候都会把锁解锁。

2.3. pthread_cond_broadcast

int pthread_cond_broadcast(pthread_cond_t *cond);

传入参数:pthread_cond_t的结构体指针

功能:唤醒所有正在pthread_cond_wait(线程等待)的线程

2.4. pthread_cond_wait: 

int pthread_cond_wait (pthread_cond_t *__restrict __cond , pthread_mutex_t *__restrict __mutex)

第一个参数:pthread_cond_t的结构体指针

第二个参数:pthread_mutex_t结构体指针

功能:线程等待并挂起,若被唤醒了,则直接跳出挂起状态。

三.推流项目中视频队列的实现:

#include "ffmpeg_video_queue.h"//VIDEO队列的构造器,包含mutex的初始化和条件变量初始化
VIDEO_QUEUE::VIDEO_QUEUE()
{pthread_mutex_init(&videoMutex, NULL);//mutex的初始化pthread_cond_init(&videoCond, NULL);//条件变量初始化
}//VIDEO队列的析构函数,锁的销毁和条件变量的销毁
VIDEO_QUEUE ::~VIDEO_QUEUE()
{pthread_mutex_destroy(&videoMutex);//锁的销毁pthread_cond_destroy(&videoCond);//条件变量的销毁
}//VIDEO_QUEUE的插入视频队列操作
int VIDEO_QUEUE::putVideoPacketQueue(video_data_packet_t *video_packet)
{pthread_mutex_lock(&videoMutex); //上视频锁video_packet_queue.push(video_packet);//向视频队列插入video_data_packet_t包pthread_cond_broadcast(&videoCond);//唤醒视频队列pthread_mutex_unlock(&videoMutex);//解视频锁return 0;
}//VIDEO_QUEUE取出视频包
video_data_packet_t *VIDEO_QUEUE::getVideoPacketQueue()
{pthread_mutex_lock(&videoMutex);//上视频锁while (video_packet_queue.size() == 0){pthread_cond_wait(&videoCond, &videoMutex);  //当视频队列没有数据的时候,等待被唤醒}video_data_packet_t *item = video_packet_queue.front();//把视频数据包移到最前面video_packet_queue.pop();//pop取出视频数据并删除pthread_mutex_unlock(&videoMutex);//解视频锁return item;
}//VIDEO_QUEUE视频队列长度
int VIDEO_QUEUE::getVideoQueueSize()
{unsigned int count = 0;pthread_mutex_lock(&videoMutex);//上视频锁count = video_packet_queue.size();//获取视频队列长度pthread_mutex_unlock(&videoMutex);//解视频锁return count;
}

该示意图展示了视频队列的实现流程。VIDEO_QUEUE类封装了三个核心方法:putVideoPacketQueue用于添加视频队列数据,getVideoPacketQueue用于获取队列数据,getVideoQueueSize则用于查询当前队列长度。

3.1. VIDEO_QUEUE构造器:

这里创建一个VIDEO_QUEUE的C++的构造器,C++构造器主要初始化了线程的量。包括:线程锁的初始化(pthread_mutex_init)、线程条件变量的初始化(pthread_cond_init)。

3.2.putVideoPacketQueue的讲解:

//VIDEO_QUEUE的插入视频队列操作
int VIDEO_QUEUE::putVideoPacketQueue(video_data_packet_t *video_packet)
{pthread_mutex_lock(&videoMutex); //上视频锁video_packet_queue.push(video_packet);//向视频队列插入video_data_packet_t包pthread_cond_broadcast(&videoCond);//唤醒视频队列pthread_mutex_unlock(&videoMutex);//解视频锁return 0;
}

putVideoPacketQueue主要用于处理video_data_packet_t的入队操作。具体流程如下:

  1. 首先通过pthread_mutex_lock获取互斥锁;
  2. 执行入队操作video_packet_queue.push(video_packet)
  3. 入队完成后,通过pthread_cond_broadcast通知出队线程处理数据;
  4. 最后调用pthread_mutex_unlock释放锁。

之前相关联系代码截图

3.3. getVideoPacketQueue的讲解:

//VIDEO_QUEUE取出视频包
video_data_packet_t *VIDEO_QUEUE::getVideoPacketQueue()
{pthread_mutex_lock(&videoMutex);//上视频锁while (video_packet_queue.size() == 0){pthread_cond_wait(&videoCond, &videoMutex);  //当视频队列没有数据的时候,等待被唤醒}video_data_packet_t *item = video_packet_queue.front();//把视频数据包移到最前面video_packet_queue.pop();//pop取出视频数据并删除pthread_mutex_unlock(&videoMutex);//解视频锁return item;
}

getVideoPacketQueue 主要负责处理 video_data_packet_t 的入队操作,具体流程如下:

  1. 首先通过 pthread_mutex_lock 进行加锁操作
  2. 检查视频队列是否为空(video_packet_queue.size()==0
    • 如果队列为空,则调用 pthread_cond_wait 等待线程被唤醒
    • 如果队列不为空且线程已被唤醒,则执行数据出队操作
  3. 数据出队分为两个步骤:
    • 使用 video_packet_queue.front() 获取队列首部数据
    • 调用 video_packet_queue.pop() 移除队列首部数据

之前相关联系代码截图

http://www.dtcms.com/a/499774.html

相关文章:

  • web自动化测试——Excel表格数据提取
  • nerfstudio使用colmap处理图像数据的小问题
  • SQL 中的 UCASE() 函数详解
  • 中国互联网协会网站爱客crm系统
  • 企业网站导航栏高度58同城最新招聘网找工作招聘信息
  • [AI 学习日记] 深入解析MCP —— 从基础配置到高级应用指南
  • Linux 系统中修改主机名
  • 网站建设公司968青岛工程有限公司
  • makefile - NXP - busybox环境下makefile中调用系统命令的方法
  • 13 pyflink/scala 进行 csv 文件的批处理
  • java ThreadPoolExecurtor源码解读 --- Worker
  • 20251018在ubuntu24.04下解压缩gz压缩包
  • 做赚钱的网站有哪些园林绿化
  • 静态网站开发用到的技术产品报价网
  • 【小学教辅】新版一年级上册语文第四单元课课贴 一年级语文复韵母学习资料 小学拼音考点练习电子版可下载打印|夸克网盘
  • 企业网站空间不足怎么办商标设计logo免费生成器网站
  • python 字典 列表 类比c++【python】
  • plsql developer 无法跟踪调试
  • Collections 工具类 15 个常用方法源码:sort、binarySearch、reverse、shuffle、unmodifiableXxx
  • mb与使用场景
  • 建设通网站是什么时间成立加入google广告wordpress
  • AI Coding 基础实践01 - TickTalk的MarsCode-Trae AI(Trae 插件)在Pycharm中的配置
  • [SCADE编译原理] 因果性分析原理(2001)
  • 网站建设pc指什么软件佛山新网站建设策划
  • RDEx:一种效果驱动的混合单目标优化器,自适应选择与融合多种算子与策略
  • JavaScript学习第三天:运算符
  • C++进阶之操作符重载函数operator[]:用法实例(四百三十五)
  • 《小白学随机过程》第一章:随机过程——定义和形式(附录2. 随机变量和随机过程公式解读)
  • 近代通信技术的发展
  • 实用网站的设计与实现wordpress简介