Singleton: WebRTC中ThreadManager中的单例模式

1. 什么是单例模式:

旨在确保一个类只有一个实例,并提供全局访问点。

应用场景:需要一个全局唯一的实例,避免资源浪费。

2. 单例模式的实现:

  1. Lazy Initialization(懒汉式)(延迟初始化):是有在需要时才创建实例,一般是第一次访问时才初始化,为了避免线程安全问题,通常需要加锁;
  2. Eager Initialization(饿汉式)(立即初始化):在类加载时就创建实例,确保类一开始就有一个唯一实例,不需要考虑线程安全问题,但在类加载时就初始化可能会导致一些性能上的开销;
  3. 双重检查锁定(Double-Checked Locking):(与第一种模式的加锁模式一样)

注:单例模式的类的构造函数和析构函数一定是private的!!

举例:

第一种方式:(为了保证线程安全,需要对getInstance()方法加锁)

cpp 复制代码
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
class Singleton {
private:
	static Singleton *instance;
	static std::mutex mtx;	// 用于加锁
	Singleton() {}	// 私有构造函数!!
public:
	static Singleton *getInstance() {
		if (instance == nullptr) {
			std::lock_guard<std::mutex> lock(mtx); // 加锁
			if (instance == nullptr) {
				instance = new Singleton();
  			}
		}
		return instance;
	}
};

第二种方式:

cpp 复制代码
// 在类加载时就初始化实例
Singleton* Singleton::instance = new Singleton();
class Singleton {
private:
    static Singleton* instance;
    Singleton() {}  // 私有构造函数

public:
    static Singleton* getInstance() {
        return instance;  // 直接返回实例
    }
};

WebRTC中的单例模式:

cpp 复制代码
class ThreadManager {
public:
	static ThreadManager *Insance() {
		static ThreadManager *const thread_manager = new ThreadManager();
		return thtread_manager;
	}
private:
	ThreadManager() {
		pthread_key_create(&key_, nullptr);
	}
	~ThreadManager() {}
};

这是典型的懒汉式(Lazy Singleton)实现,使用了【局部静态变量】的方式来确保单例实例的唯一性,并且保证线程安全。

局部静态变量:

  1. 作用域:只能在声明它的函数内部访问,不能在函数外部直接访问;
  2. 生命周期:它在程序的整个运行周期都存在(即它在函数第一次调用时被创建,在程序结束时被销毁,所以thread_manager_在程序退出时销毁,不会有内存泄露?)
  3. 初始化:只在第一次被调用时初始化,后续的调用都会使用已经初始化的值。

为什么局部静态变量的初始化是线程安全的:

【从C++11开始】,局部静态变量是线程安全的,C++11保证在多线程场景下,只有一个线程能够初始化这个静态变量,其他线程将等待该变量初始化完成后再访问它,【这是由编译器和操作系统实现确保的(内存屏障?std::atomic?)】。

相关推荐
换个昵称都难1 小时前
webrtc 拥塞控制GCC 和PCC
webrtc
Cxiaomu2 小时前
React接入WebRTC实时视频实践
react.js·音视频·webrtc
AndyHuang19765 小时前
WebRTC 强制 Relay 模式下 TCP 重连失败深度排查与优化实战
webrtc
换个昵称都难5 小时前
webrtc pacing 平滑发包模块
webrtc
换个昵称都难6 小时前
webrtc 音频混音介绍
音视频·webrtc
换个昵称都难1 天前
webrtc QOS-RemoteBitrateEstimator接收端带宽估计(1)
webrtc
换个昵称都难1 天前
webrtc QOS-RemoteBitrateEstimator接收端带宽估计-四个实例(2)
webrtc
都在酒里1 天前
【极致低延时】香橙派部署 MediaMTX 实现 WebRTC 推流,延时仅 500-800ms,比局域网 ffmpeg 拉流快近 10 倍!(附踩坑全记录)
linux·arm开发·ffmpeg·webrtc·orangepi·嵌入式软件
换个昵称都难1 天前
WebRTC QoS 实战:从原理到弱网优化
开发语言·php·webrtc
小哈机器人1 天前
Phantom Bridge:一个基于WebRTC的ROS2远程可视化与遥操作工具
机器人·webrtc·数据可视化