C++的Magic Static
什么是“Magic Static”?
C++ 中,函数内部的静态变量只会在第一次执行该函数时被初始化,而且这种初始化在 C++11 标准之后是线程安全的。这意味着即使多个线程同时第一次调用该函数,静态变量也只会被初始化一次,并且在初始化完成前,其他线程会被阻塞,等待初始化完成后再访问该变量。这种特性被称为“Magic Static”。
使用场景
“Magic Static” 常用于实现单例模式(Singleton Pattern)或类似需要懒初始化的场景。相比于传统的双重检查锁定,使用“Magic Static”可以简化代码,同时确保线程安全。比如单例模式中的使用:
class Singleton {
public:static Singleton& getInstance() {static Singleton instance; // Magic Staticreturn instance;}private:Singleton() = default;~Singleton() = default;// 禁止拷贝和赋值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
工作流程
- 第一次调用: 当 getInstance() 函数第一次被调用时,static Singleton instance; 会触发 Singleton 对象的构造。这时,C++11 保证了构造过程是线程安全的——如果多个线程同时调用该函数,只有一个线程会初始化 instance,其他线程会等待初始化完成后再获取 instance。
- 后续调用: 在第一次初始化之后,instance 变量已经初始化完成,后续调用 getInstance() 函数时,直接返回该已经初始化的对象。
线程安全的实现
在 C++11 之前,函数内的静态变量初始化并不是线程安全的,可能导致多个线程同时初始化静态变量,从而产生未定义行为。然而,从 C++11 开始,标准保证了静态变量在首次初始化时的线程安全性,这就是“Magic Static”名称的由来。
优点
- 简洁: 相比于双重检查锁定的复杂性,使用“Magic Static”可以让代码更简单且容易理解。
- 高效: 由于 C++11 保证了静态变量的线程安全性,不需要额外的锁机制来确保线程安全。
- 懒初始化: 静态变量只有在首次调用时才会被初始化,节省了不必要的资源消耗。
适用场景
- 单例模式: 实现单例模式时,Magic Static 可以确保单例对象的唯一性和线程安全性。
- 惰性初始化: 需要在第一次使用某个资源时初始化它,而不希望在程序启动时就初始化所有资源。
- 全局对象: 通过函数返回全局对象的引用,而不希望它在程序启动时就被创建。
总结
“Magic Static” 是 C++11 之后引入的线程安全静态变量初始化机制,在需要线程安全的惰性初始化时非常有用。通过利用这一特性,可以简化代码,避免复杂的锁机制,实现高效且安全的单例模式或其他类似场景。
相关文章:
C++的Magic Static
什么是“Magic Static”? C 中,函数内部的静态变量只会在第一次执行该函数时被初始化,而且这种初始化在 C11 标准之后是线程安全的。这意味着即使多个线程同时第一次调用该函数,静态变量也只会被初始化一次,并且在初始…...

vscode添加宏定义
1 起因 在用vscode看项目代码时,如果源文件中的代码块被某个宏定义给包裹住了,则在vscode的默认配置下,不会高亮显示这块被包裹住的代码,如下图中229行开始的代码被STM32F40_41xxx所控制,没有高亮显示。 由于STM32F4…...

Postman接口关联
接口关联 接口之间存在依赖关系,接口B要依赖于接口A的返回值。 例如:现在有两个接口,接口1:获取接口统一鉴权码token接口,接口2:创建标签接口。接口2里的请求参数需要依赖接口1返回的值,即需要…...

用Python制作开心消消乐游戏|附源码
制作一个完整的“开心消消乐”风格的游戏在Python中是一个相对复杂的项目,因为它涉及到图形界面、游戏逻辑、动画效果以及用户交互等多个方面。不过,我可以为你提供一个简化的版本和概念框架,帮助你理解如何开始这个项目,并提供一…...

ArcGIS10.8 安装教程
目录 一、环境及安装包准备 二、安装流程 1、解压安装包ArcGIS_108.rar 2、安装 三、汉化 四、激活 五、自定义菜单(可选) 六、打开软件按查看 七、安装过程中出现的报错 八、其他 一、环境及安装包准备 安装环境:win7 安装包下载…...

2024网络安全学习路线,最全保姆级教程,学完直接拿捏!
关键词: 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊,学习网络安全方向通常会有哪些问题 前排提示:文末有CSDN独家网络安全资料包! 1、打基础时间太长 学基础花费很长时间,光语言都有…...

Apache Doris 中Compaction问题分析和典型案例
说明 此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括 Compaction socre高Compaction失败compaction占用资源多Compaction core 如果问题紧急,可联系社区同学处理 如果阅读中有问题,可以反馈给社区同学。 1 compaction …...

redis面试(十七)MultiLock加锁和释放锁
MultiLock MultiLock,英语直译为多个锁。 redisson分布式锁中的MultiLock这个机制,可以将多个锁合并为一个大锁,对一个大锁进行统一的申请加锁以及释放锁 一次性锁定多个资源,再去处理一些事情,然后事后一次性释放所…...

电脑开机LOGO修改教程_BIOS启动图片替换方法
准备工具:刷BIOS神器和change logo,打包下载地址:https://download.csdn.net/download/baiseled/89374686 一.打开刷BIOS神器,点击备份BIOS,保存到桌面 二.打开change logo,1.点击load image,选…...
微前端架构的持续集成与持续部署实践
在软件开发中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)是实现高效、自动化软件交付的关键实践。微前端架构通过将应用拆分为多个自治的子应用,带来了开发和部署上的灵活…...
【STM32 FreeRTOS】事件标志组
事件标志组简介 事件标志组:用一个比特位来表示事件是否发生 事件标志组是一组事件标志位的集合,可以简单理解为事件标志组就是一个整数。 事件标志组的特点: 它的每一位表示一个事件(高八位不算)每一位事件的含义…...

【启动centos报错】另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘.
启动centos报错 另一个程序已锁定文件的一部分,进程无法访问打不开磁盘“D:\Program2\CentOS\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。模块“Disk”启动失败。未能启动虚拟机。解决方法 删除.lck文件...

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测
目录 前言 1.扩大检测框区域 2.先检测手部,后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测,然后扩大检测框区域,并对该区域使用YOLOv8-s-pose使用关键…...
kylin系统永久关闭iptables
1 关闭iptables, 并且相关规则写入文件firewall.rules sudo iptables-save > /root/firewall.rules iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P …...

写一个githubDemo
1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…...

java入门-成员内部类和静态内部类的访问
(一)成员内部类 package InnerClass;import javax.print.attribute.standard.MediaSize;public class Outer {//2外部类中的成员private int age99;public static String a;public class Inner{//普通的成员内部类//1.1成员变量public String name;priva…...

ansible【自动化配置】(thirty day)
回顾 1、mysql和python (1)不需要执行mysql_ssl_rsa_setup (2)Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql (1)connpymysql.connect(host,user,password,database,prot) …...
GitOps Tekton+ArgoCD
GitOps 提供了一种基于 Git 的操作理念,而 Tekton 和 ArgoCD 分别作为 CI/CD 工具,共同实现了这一理念在 Kubernetes 集群中的应用 k8s只是jenkins 流水线中的一环,但是在tekton中,k8s是基础设施 工作流程: 代码提交…...

uniapp用户列表页面渲染、增删改查逻辑
<template><view class="container">...

力扣高频SQL 50题(基础版)第四十七题之1321.餐馆营业额变化增长
力扣高频SQL 50题(基础版)第四十七题 1321.餐馆营业额变化增长 题目说明 表: Customer ---------------------- | Column Name | Type | ---------------------- | customer_id | int | | name | varchar | | visited_on | date | | amount | …...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...