ZLMediaKit源码分析——[1] 开篇:onceToken源码分析

系列文章目录

第一篇 基于SRS 的 WebRTC 环境搭建
第二篇 基于SRS 实现RTSP接入与WebRTC播放
第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建
第四篇 WebRTC学习一:获取音频和视频设备
第五篇 WebRTC学习二:WebRTC音视频数据采集
第六篇 WebRTC学习三:WebRTC音视频约束
第七篇 WebRTC学习四:WebRTC常规视觉滤镜
第八篇 WebRTC学习五:从视频中提取图片
第九篇 WebRTC学习六:MediaStream 常用API介绍
第十篇 WebRTC学习七:WebRTC 中 STUN 协议详解
ZLMediaKit源码分析——[1] 开篇:基础库 ZLToolKit 之 onceToken 源码分析


文章目录

  • 系列文章目录
  • 前言
  • 一、onceToken 类详解
    • 1. RAII 机制介绍
    • 2. onceToken 的作用
    • 3. onceToken 的使用场景
    • 4. onceToken 的代码实现
  • 二、onceToken的作用
  • 三、onceToken 在 ZLToolKit 中的真实使用例子
    • 1.TaskExecutorInterface::sync 函数
    • 2.TaskExecutorInterface::sync_first 函数
  • 四、测试用例
    • 1. 带构造和析构函数的测试用例
    • 2. 简化版异步任务执行测试用例
    • 3. 带捕获异常的测试用例
  • 总结


前言

ZLMediaKit 是一款功能强大的开源音视频流处理项目,它支持多种音视频协议,能够实现音视频的推流、拉流、转码等多种功能,广泛应用于直播、视频会议等领域。而 ZLToolKit 作为其基础工具库,提供了许多通用的工具类和函数,如网络编程、内存管理、线程池等,这些工具类和函数为 ZLMediaKit 的开发提供了便利,提高了开发效率。

onceToken类就是ZLToolKit 中的一部分,ZLMediaKit 源码中多处使用了onceToken类,理解它的设计和使用方法,将有助于我们更好地理解 ZLMediaKit 的源码。


一、onceToken 类详解

1. RAII 机制介绍

AII 是一种在 C++ 中广泛应用的编程技术,其核心思想是将资源的生命周期与对象的生命周期绑定在一起。当对象被创建时,资源被获取;当对象被销毁时,资源被自动释放。这种机制利用了 C++ 语言的析构函数特性,确保资源在任何情况下(包括异常抛出)都能被正确释放,从而避免了资源泄漏的问题。

例如,在 C++ 中使用 std::unique_ptr 管理动态分配的内存就是 RAII 机制的一个典型应用:

#include <iostream>
#include <memory>int main() {std::unique_ptr<int> ptr(new int(42));std::cout << *ptr << std::endl;// 当 ptr 离开作用域时,其析构函数会自动释放内存return 0;
}

2. onceToken 的作用

onceToken 类正是基于 RAII 原则实现的。它的主要作用是在对象构造时执行一个操作,在对象析构时执行另一个操作,确保资源的正确释放,即使在发生异常的情况下也能保证资源的清理。

3. onceToken 的使用场景

确保操作只执行一次:无论操作是在 onceToken 对象析构时自动触发,还是通过手动调用相关方法触发,都不会出现重复执行的情况。
资源管理:在获取资源后,需要确保在对象生命周期结束时释放资源,例如文件句柄、网络连接等。使用 onceToken 可以方便地实现资源的自动释放。
异常安全:在执行一系列操作时,需要确保某些操作在异常发生时也能被执行,例如解锁互斥锁、释放信号量等。onceToken 可以保证即使在异常情况下,这些操作也能被执行。

4. onceToken 的代码实现

以下是 onceToken 类的完整代码:

#ifndef UTIL_ONCETOKEN_H_
#define UTIL_ONCETOKEN_H_#include <functional>
#include <type_traits>namespace toolkit {class onceToken {
public:using task = std::function<void(void)>;template<typename FUNC>onceToken(const FUNC &onConstructed, task onDestructed = nullptr) {onConstructed();_onDestructed = std::move(onDestructed);}onceToken(std::nullptr_t, task onDestructed = nullptr) {_onDestructed = std::move(onDestructed);}~onceToken() {if (_onDestructed) {_onDestructed();}}private:onceToken() = delete;onceToken(const onceToken &) = delete

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35095.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序&#xff0c;虽然不是特别复杂的游戏&#xff0c;但是是第一次写&#xff0c;肯定要记录一下了&#xff0c;哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏&#xff0c;类似下…

TSB - AD 解读 — 迈向可靠、透明的 TSAD 任务

目录 一 文章动机 二 TSAD 领域内的两类缺陷 三 数据集的构建 四 实验结果及结论 项目宣传链接&#xff1a;TSB-AD 代码链接&#xff1a; TheDatumOrg/TSB-AD: TSB-AD: Towards A Reliable Time-Series Anomaly Detection Benchmark 原作者解读&#xff1a;NeurIPS 2…

Java 大视界 -- Java 大数据机器学习模型的对抗攻击与防御技术研究(137)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Python 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

C++11 lambda表达式、包装器、Bind绑定

Hello&#xff01;大家早上中午晚上好&#xff01;&#xff01;今天来复习C11三个新加的特性&#xff01;&#xff01; 一、lambda 表达式 1.1什么是lambda表达式&#xff1f; 语法&#xff1a;[捕捉列表]&#xff08;参数列表&#xff09;->返回值{函数体}&#xff1b; …

计算机网络:(二)计算机网络在我国发展与网络类别与性能 (附带图谱更好对比理解)

计算机网络&#xff1a;&#xff08;二&#xff09;计算机网络在我国发展与网络类别和性能 前言一、计算机网络在我国的发展二、计算机网络的类别1. 计算机网络的定义2. 不同类别的计算机网络&#xff08;1&#xff09;按覆盖范围分类&#xff08;2&#xff09;按传输技术分类…

CoreData 调试警告:多个 NSEntityDescriptions 声明冲突的解决

概述 目前在苹果生态 App 的开发中&#xff0c;CoreData 数据库仍然是大部分中小应用的优先之选。不过&#xff0c;运行时 CoreData 常常产生各种“絮絮叨叨”的警告不禁让初学的秃头小码农们云里雾里。 这不&#xff0c;对于下面这一大段 CoreData 警告&#xff0c;大家是否一…

解决QT_Debug 调试信息不输出问题

方式1 &#xff1a;手动通过添加环境变量解决 ->使用命令&#xff1a; QT_LOGGING_TO_CONSOLE1 qtcreator启动 ->如若还未输出qDebug调试信息 则在程序中引<QLoggingCategory>包 #include <QLoggingCategory> ->在程序入口添加 QLoggingCategory::defa…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目&#xff1a; 思路&#xff1a; 被标签害了&#xff0c;用什么二分&#xff08; 很简单的思维题&#xff0c;首先如果a > b&#xff0c;那么全选a就行了&#xff0c;还搞啥活动 否则就选 b - a 天来搞活动&#xff0c;为什么&#xff1f; 首先如果我…

[MAVEN][经验总结]MAVEN_HOME和M2_HOME的配置建议

前言 MAVEN_HOME和M2_HOME都是maven的环境变量&#xff0c;要配置哪个&#xff0c;与maven版本有关&#xff0c;我在实操过程中遇到相关的问题&#xff0c;现记录如下。 MAVEN_HOME和M2_HOME的区别 MAVEN_HOME 和 M2_HOME 本质上是同一个作用的环境变量&#xff0c;它们的区…

力扣Hot100——169. 多数元素

解法1&#xff1a;使用HashMap 将nums数组映射到HashMap中&#xff0c;键为nums的值&#xff0c;值为nums中值的数量&#xff1b; 然后遍历哈希表&#xff0c;返回值最大的键 class Solution {private Map<Integer, Integer> countNums(int[] nums) {Map<Integer, Int…

EasyRTC嵌入式音视频通话SDK:微信生态支持、轻量化架构与跨平台兼容性(Linix/Windows/ARM/Android/iOS/LiteOS)

随着WebRTC技术的不断发展&#xff0c;实时音视频通信在各个领域的应用越来越广泛。EasyRTC嵌入式音视频通话SDK作为一款基于WebRTC技术的实时通信解决方案&#xff0c;凭借其强大的功能和灵活的集成能力&#xff0c;受到了越来越多开发者的关注。 一、系统架构设计 纯C语言开…

QuickAPI:一键将 Excel 数据转为数据库表

在开发和数据管理中&#xff0c;将 Excel 数据快速导入数据库是一项常见需求&#xff0c;但手动建表和导入的过程往往让人头疼。 QuickAPI 作为一款高效的统一数据服务平台&#xff0c;提供了一键将 Excel 数据转为数据库表的功能&#xff0c;极大简化了操作流程。本文将以技术…

【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…

JavaScript如何做类型转换

一、类型转换 二、补充 console.log(1 "2" "2"); // 122 console.log(1 "2" "2"); // 32 console.log(1 -"1" "2"); // 02 console.log("1" "1" "2"); // 112 consol…

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…

【PyTorch][chapter-35][MLA]

前言&#xff1a; MLA&#xff08;Multi-head Latent Attention&#xff0c;多头潜在注意力&#xff09;旨在提高推理效率和降低计算资源的消。MLA的核心思想在于通过信息转移来优化KV缓存的使用 MLA的技术特点主要包括&#xff1a; KV压缩与潜在变量&#xff1a;将键&#xff…

Spring Cloud 中的服务注册与发现: Eureka详解

1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时&#xff0c;URL 是写死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时&#xff0c;这个 URL 就需要相应地变…

微服务存在的问题及解决方案

微服务存在的问题及解决方案 1. 存在问题 1.1 接口拖慢 因为一个接口在并发时&#xff0c;正好执行时长又比较长&#xff0c;那么当前这个接口占用过多的 Tomcat 连接&#xff0c;导致其他接口无法即时获取到 Tomcat 连接来完成请求&#xff0c;导致接口拖慢&#xff0c;甚至…

centos 安装pip时报错 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

centos 安装pip时报错 [rootindex-es app-ai]# yum update Loaded plugins: fastestmirror Repository centos-sclo-rh is listed more than once in the configuration Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org?archx86_64…