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?)】。

相关推荐
EasyDSS1 天前
场景深耕:低延迟高并发EasyDSS无人机RTMP高清推流直播技术剖析
ffmpeg·webrtc·rtmp
EasyDSS1 天前
EasyDSS以视频点播VOD/高清直播/WebRTC视频会议/语音转写STT技术创新,解决校园数字化核心难题
音视频·webrtc·语音识别·点播技术·流媒体直播
daad7773 天前
WEBRTC DTLSv1.2 加密示例
webrtc
淡泊if3 天前
低延迟直播终极方案:WebRTC + MediaMTX,延迟<500ms!
webrtc·视频流·mediamtx
Eanve4 天前
python搭建webrtc音视频服务端客户端
python·音视频·webrtc
@大吉5 天前
【思维导图】一图了解WebRTC通信流程,以及SFU和MediaSoup
webrtc·mediasoup
却道天凉_好个秋5 天前
WebRTC(十六):NetEQ
webrtc·neteq·fec
zhuxian20095 天前
webrtc两个client配对交互信令流程
webrtc
REDcker6 天前
WebRTC 源码架构深度解析
架构·webrtc
EasyDSS6 天前
EasyDSS如何基于LiveKit/AI大模型/AI会议助手/语音转写STT技术破解音视频应用核心痛点
人工智能·音视频·webrtc·语音识别·点播技术·流媒体直播