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 源码分析



前言

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值