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

Singleton: WebRTC中ThreadManager中的单例模式

1. 什么是单例模式:

旨在确保一个类只有一个实例,并提供全局访问点。
应用场景:需要一个全局唯一的实例,避免资源浪费。

2. 单例模式的实现:

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

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

举例:

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

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;}
};

第二种方式:

// 在类加载时就初始化实例
Singleton* Singleton::instance = new Singleton();
class Singleton {
private:static Singleton* instance;Singleton() {}  // 私有构造函数public:static Singleton* getInstance() {return instance;  // 直接返回实例}
};

WebRTC中的单例模式:

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

相关文章:

Singleton: WebRTC中ThreadManager中的单例模式

1. 什么是单例模式&#xff1a; 旨在确保一个类只有一个实例&#xff0c;并提供全局访问点。 应用场景&#xff1a;需要一个全局唯一的实例&#xff0c;避免资源浪费。 2. 单例模式的实现&#xff1a; Lazy Initialization&#xff08;懒汉式&#xff09;&#xff08;延迟初…...

MySQL数据库笔记——多版本并发控制MVCC

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍MySQL的并发控制&#xff1a;多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…...

【0x0037】HCI_Write_Link_Supervision_Timeout命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Write_Link_Supervision_Timeout 命令格式 2.2. Handle 2.3. Link_Supervision_Timeout 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 3.3. Handle 四、命令执行流程 4.1. 命令准备阶段 4.…...

Linux下如何进行内存泄漏分析

前言 正文 一、环境的安装 1、tar –xf valgrind-3.17.0.tar.bz2 2、cd valgrind-3.17.0 3、./configure // 运行配置脚本生成makefile文件&#xff0c;可以--help查看配置项&#xff0c;自行按需配置&#xff0c;比如修改编译工具、修改安装路径等 4、make 5、make…...

Colyseus Metadata 详解

Colyseus Metadata 详解 Colyseus 是一个专注于实时多人在线游戏和应用的框架&#xff0c;它的 metadata 功能为每个房间提供了一个灵活且有用的机制&#xff0c;用来存储和共享与房间相关的非实时信息。这些信息可以用来描述房间、标记房间状态、或提供额外的房间配置选项。 …...

C语言day5:shell脚本

一、练习题1 定义一个find函数&#xff0c;查找ubuntu和root的gid并使用变量接收结果 二、练习题2 定义一个数组&#xff0c;写一个函数完成对数组的冒泡排序 三、练习题3 使用break求1-100中的质数&#xff08;质数&#xff1a;只能被1和它本身整除&#xff0c;如&#xff1a;…...

微记录-Linux字符设备的write函数如何避免文件系统重复调用?

背景 linux字符设备的fops实现read write的时候&#xff0c;尤其是write&#xff0c;因为会指定写入的总长度&#xff0c;那么如果如果驱动中单次write最大个数小于需求len的时候&#xff0c;文件系统就会多次调用到write。他是根据wirte函数的返回值来判断的。如果返回值不是…...

本地调试自定义Maven Plugin步骤

添加自定义插件到dependencies 找到对应依赖的类&#xff0c;打上断点。 debug运行插件。...

二、github基础

Github基础 备用github.com网站一、用户界面-Overview&#xff08;概览&#xff09;1用户信息2 导航栏3 热门仓库4 贡献设置5贡献活动6搜索和筛选7自定义收藏8贡献统计9最近活动10其他链接 二、用户界面-Repositories&#xff08;仓库&#xff09;1 libusb_stm322 savedata3 Fi…...

如何在 Vue 2 中使用 Swiper 5.4.5 处理静态与后端数据不能切换问题

一、文章大纲 1.前言 介绍 Swiper 作为一款强大的轮播组件,常用于处理图片、文章、商品等内容的滑动展示。 在 Vue.js 项目中集成 Swiper,尤其是在 Vue 2 中使用,常见的两种数据来源:静态数据与后端数据。 在 Vue 2 项目中集成 Swiper 5.4.5 2.如何通过 npm 安装 Swiper…...

request.getSession().getAttribute(Constants.ADMIN_ID)

你提出了一个非常好的问题&#xff01; 确实&#xff0c;使用 request.getSession().getAttribute(Constants.ADMIN_ID) 也能从 Session 中获取属性&#xff0c;那么 SessionAttribute 注解和这种方式到底有什么区别呢&#xff1f; request.getSession().getAttribute(Constan…...

线性回归模型的构建与训练

1.基本的导入与配置 # To support both python 2 and python 3 from __future__ import division, print_function, unicode_literals# Common imports import numpy as np import pandas as pd import os# to make this notebooks output stable across runs np.random.seed(4…...

【JavaWeb后端学习笔记】MySQL的常用函数(字符串函数,数值函数,日期函数,流程函数)

MySQL函数 1、字符串函数2、数值函数3、日期函数4、流程函数 1、字符串函数 函数说明concat(s1, s2, …, sn)字符串拼接&#xff0c;将 s1, s2, …, sn 拼接成一个字符串lower(str)将字符串 str 全部转为小写upper(str)将字符串 str 全部转为大写lpad(str, n, pad)左填充&…...

【推送】主流的服务端推送技术的对比

推送技术的对比 以下是主流的服务端推送技术的对比表格&#xff0c;涵盖WebSocket、Server-Sent Events (SSE)、Long Polling、HTTP/2 Push和Comet&#xff1a; 特性WebSocketServer-Sent Events (SSE)Long PollingHTTP/2 PushComet通信方向双向单向&#xff08;服务器到客户…...

直观解读 JuiceFS 的数据和元数据设计(一)

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储&#xff08;MinIO&#xff09; 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…...

nginx配置文件没有语法颜色

第一种办法&#xff1a; nginx-1.26.2这个目录是通过解压 nginx-1.26.2.tar.gz&#xff0c;nginx官网下的 将这四个目录复制到/usr/share/vim/vimfiles/目录下 cp -ar ./* /usr/share/vim/vimfiles/ 再次进入nginx配置文件可以看到已经有颜色了 第二种方法&#xff1a; …...

PCB层叠结构设计

PCB层叠结构设计 层叠结构设计不合理完整性相关案例&#xff1a;在构成回流路径时&#xff0c;由于反焊盘的存在&#xff0c;使高速信号回流路径增长&#xff0c;造成信号回流路径阻抗不连续&#xff0c;对信号质量造成影响。 PCB层叠结构实物&#xff1a;由Core 和 Prepreg&a…...

电子应用设计方案83:智能 AI 打印机系统设计

智能 AI 打印机系统设计 一、引言 智能 AI 打印机系统旨在提供更高效、便捷和个性化的打印服务&#xff0c;融合了人工智能技术&#xff0c;以满足不断变化的用户需求。 二、系统概述 1. 系统目标 - 实现自动纸张检测、调整打印参数&#xff0c;适应不同纸张类型和尺寸。 - 具…...

windows安装rsync Shell语句使用rsync

sh脚本里使用 rsync功能&#xff0c;需要提前布置rsync环境 第一步&#xff0c;下载 libxxhash-0.8.2-1-x86_64.pkg.tar 下载压缩包地址 Index of /msys/x86_64/https://repo.msys2.org/msys/x86_64/ 下载对应版本&#xff0c;没特殊需求下载最高版本就行了 解压缩压缩包 …...

Django 模型

Django 模型 Django 模型是 Django 框架的核心组件之一,它用于定义应用程序的数据结构。在 Django 中,模型是 Python 类,通常继承自 django.db.models.Model。每个模型类代表数据库中的一个表,模型类的属性对应表中的字段。 1. 创建模型 创建 Django 模型非常简单。首先…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...