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

单例设计模式共享数据问题分析、解决(c++11)设计多线程。

系列文章目录

单例设计模式共享数据问题分析、解决;


文章目录

  • 系列文章目录
  • 前言
  • 一、单例模式
    • 1.1 基本概念
    • 1.2 单例设计模式共享数据问题分析、解决
    • 1.3 std::call_once()介绍
  • 二、代码案例
    • 1.代码示例
  • 总结


前言


关键内容:c++11、多线程、共享数据、单例类
本章内容参考github大佬文章:
学习参考链接源码:
https://github.com/xiaopang59/multithreading

``

一、单例模式

1.1 基本概念

  • 使用频率较高;
  • 单例:整个项目中,由某个或者某些特殊的类,属于该类的对象,我只能创建1个,多了我创建不了;

1.2 单例设计模式共享数据问题分析、解决

面临的问题:
需要在我们自己创建的线程(而不是主线程)中创建MyCAS这个单例类的对象,这种线程可能不止一个(最少2个)。
解决:
我们可能会面临GetInstance()这种成员函数需要互斥;
虽然这两个线程是同一个入口函数,但大家千万要记住,这是两个线程,所以这里会有两个流程(两条通路)同时执行

GetInstance()函数功能是创建MyCAS类对象,通过new的方式分配动态内存,可参考下面代码。

1.3 std::call_once()介绍

std::call_once():C++11引入的函数,该函数的第二个参数 是一个函数名a();

  • call_once功能是能够保证函数a()只被调用一次。
  • call_once具备互斥量这种能力,而且效率上,比互斥量消耗的资源更少;
  • call_once()需要与一个标记结合使用,这个标记std::once_flag;其实once_flag是一个结构;
  • call_once()就是通过这个标记来决定对应的函数a()是否执行,调用call_once()成功后,call_once()就把这个标记设置为一种已调用状态;
  • 后续再次调用call_once(),主要once_flag设置了"已调用"状态,那么对性的函数a()就不会再被执行了;

二、代码案例

1.代码示例

#include <SDKDDKVer.h>
#include <stdio.h>
#include <tchar.h>#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <thread>
#include <list>
#include <mutex>using namespace std;//class A
//{
//public:
//};std::mutex resource_mutex;
std::once_flag g_flag; //这是个系统定义的标记class MyCAS //这是一个单例类
{static void CreateInstance()//只被调用1次{std::chrono::milliseconds dura(2000);//休息20sstd::this_thread::sleep_for(dura);cout << "CreateInstance()被执行了" << endl;m_instance = new MyCAS();static CGarhuishou c1;}private:MyCAS() {}//私有化了构造函数private:static MyCAS *m_instance;//静态成员变量public:static MyCAS *GetInstance(){//提高效率。//a)如果 if (m_instance != NULL) 条件成立,则肯定表示m_instance已经被new过了;//b)如果 if (m_instance != NULL),不代表m_instance一定没被new过;//if (m_instance == NULL)//双重锁定(双重检查)//{//  std::unique_lock<std::mutex> mymutex(resourec_mutex);//自动加锁 //  if (m_instance == NULL)//  {//  m_instance = new MyCAS();//  static CGarhuishou cl;//  }//}std::call_once(g_flag, CreateInstance);//两个线程同时执行到这里,其中一个线程要等另外一个线程执行完毕CreateInstance()。return m_instance;}class CGarhuishou//类中套类,用来释放对象{public:~CGarhuishou()//类的析构函数中{if (MyCAS::m_instance){delete MyCAS::m_instance;MyCAS::m_instance = NULL;}}};void func(){cout << "测试" << endl;}
};//类静态变量初始化
MyCAS *MyCAS::m_instance = NULL;//线程入口函数
void mythread()
{cout << "我的线程开始执行了" << endl;MyCAS *p_a = MyCAS::GetInstance();//这里可能就 有问题了p_a->func();cout << "我的线程执行完毕了" << endl;return;
}int main()
{//一:设计模式大概谈//“设计模式”:代码的一些写法(这些写法跟常规写法不怎么一样):程序灵活,维护起来可能方便,但是别人接管、阅读代码都会很痛苦;//用“设计模式”理念写出来的代码很晦涩的;《head first》//老外 应付特别大的项目的时候 把项目的开发经验、模块划分经验,总结整理成 设计模式(先有开发需求,后有理论总结和整理);//设计模式拿到中国来,不太一样,拿着一个程序(项目)往设计模式上套;一个小小的项目,它非要弄几个设计模型进去,本末倒置//设计模式肯定有它独特的优点,要活学活用,不要深陷其中,生搬硬套;//二:单例设计模式//单例设计模式,使用的频率比较 高;//单例:整个项目中,由某个或者某些特殊的类,属于该类的对象,我只能创建1个,多了我创建不了;//单例类;/*MyCAS a;MyCAS a2;*/MyCAS *p_a = MyCAS::GetInstance();//创建对象,返回该类(MyCAS)对象的指针//MyCAS *p_b = MyCAS::GetInstance();p_a->func();MyCAS::GetInstance()->func();//该装载的数据装载//三:单例设计模式共享数据问题分析、解决//面临的问题:需要在我们自己创建的线程(而不是主线程)中创建MyCAS这个单例类的对象,这种线程可能不止一个(最少2个)。//我们可能会面临GetInstance()这种成员函数需要互斥;//虽然这两个线程是同一个入口函数,但大家千万要记住,这是两个线程,所以这里会有两个流程(两条通路)同时执行std::thread mytobj1(mythread);std::thread mytobj2(mythread);mytobj1.join();mytobj2.join();//四:std::call_once():C++11引入的函数,该函数的第二个参数 是一个函数名a();//call_once功能是能够保证函数a()只被调用一次。//call_once具备互斥量这种能力,而且效率上,比互斥量消耗的资源更少;//call_once()需要与一个标记结合使用,这个标记std::once_flag;其实once_flag是一个结构;//call_once()就是通过这个标记来决定对应的函数a()是否执行,调用call_once()成功后,call_once()就把这个标记设置为一种已调用状态;//后续再次调用call_once(),主要once_flag设置了"已调用"状态,那么对性的函数a()就不会再被执行了;return 0;
}

总结

持更新中…

相关文章:

单例设计模式共享数据问题分析、解决(c++11)设计多线程。

系列文章目录 单例设计模式共享数据问题分析、解决; 文章目录系列文章目录前言一、单例模式1.1 基本概念1.2 单例设计模式共享数据问题分析、解决1.3 std::call_once()介绍二、代码案例1.代码示例总结前言 关键内容&#xff1a;c11、多线程、共享数据、单例类 本章内容参考git…...

Embedding-based Retrieval in Facebook Search

facebook的社交网络检索与传统的搜索检索的差异是&#xff0c;除了考虑文本&#xff0c;还要考虑搜索者的背景。通用搜索主要考虑的是文本匹配&#xff0c;并没有涉及到个性化。像淘宝&#xff0c;youtube这些其实都是涉及到了用户自身行为的&#xff0c;除了搜索还有推荐&…...

xmu 离散数学 卢杨班作业详解【8-12章】

文章目录第八章 树23456810第九章46811第十章24567第十一章14571116第十二章131317第八章 树 2 (2) 设有k片树叶 2∗m2∗43∗3k2*m2*43*3k2∗m2∗43∗3k n23kn23kn23k mn−1mn-1mn−1 联立解得k9 T中有9片树叶 3 有三颗非同构的生成树 4 (1) c --abc e–abed f–dgf…...

Linux入门篇-权限管理

简介 用户管理也是和权限相关的知识点。权限的作用 权限对于普通文件和目录文件作用是不一样的 。[kioskfoundation0 ~]$ ls -l total 264 -rw-rw-r--. 2 kiosk kiosk 31943 May 29 2019 ClassPrep.txt -rw-rw-r--. 2 kiosk kiosk 7605 Jun 14 2019 ClassRHAPrep.txt -rw-rw-r…...

Linux(基于 Centos7) 常用操作

1.Linux 简介Linux 是一种 免费使用、自由传播的类 Unix 操作系统Linux操作系统内核&#xff0c;由林纳斯托瓦兹在1991年10月5日首次发布...Linux 是一套开源操作系统&#xff0c;它有稳定、消耗资源小、安全性高等特点大多数人都是直接使用 Linux 发行版&#xff08;就是将 Li…...

Math类详解与Random类、三种随机数生成方式(java)

文章目录&#x1f4d6;前言&#xff1a;&#x1f380;认识Random类&#x1f380;三种随机数生成方式&#x1f380;Math类的用途&#x1f380;Math类的方法&#x1f4d6;前言&#xff1a; 本篇博客主要以介绍Math类的常用方法及认识Random类&#xff0c;及三种随机数生成方式 …...

Mac编译QT程序出现Undefined symbols for architecture x86_64

在Mac编写日志服务类, Logging_d.h内容如下 #pragma once #include <QLoggingCategory> Q_DECLARE_LOGGING_CATEGORY(hovering) Q_DECLARE_LOGGING_CATEGORY(creation) Q_DECLARE_LOGGING_CATEGORY(mouseevents) Q_DECLARE_LOGGING_CATEGORY(state) Q_DECLARE_LOGGING_C…...

蓝桥杯-李白打酒加强版

蓝桥杯-李白打酒加强版1、问题描述2、解题思路3、代码实现1、问题描述 话说大诗人李白, 一生好饮。幸好他从不开车。 一天, 他提着酒显, 从家里出来, 酒显中有酒 2 斗。他边走边唱: 无事街上走&#xff0c;提显去打酒。 逢店加一倍, 遇花喝一斗。 这一路上, 他一共遇到店 N 次…...

AtCoder Beginner Contest 292 (A - E) 记录第一场ABC

AtCoder Beginner Contest 292 A - E前言Q1 A - CAPS LOCKQ2 Yellow and Red CardQ3 Four VariablesQ4 D - Unicyclic ComponentsQ5 E - Transitivity前言 本来晚上在打Acwing周赛&#xff0c;最后一题Trie想不出来咋写&#xff0c;看群里有人说ABC要开始了&#xff0c;想着没…...

ubuntu安装使用putty

一、安装 安装虚拟机串口 sudo apt-get install putty sudo apt install -y setserial 二、使用 虚拟机连接串口 sudo setserial -g /dev/ttyS* 查看硬件对应串口 找到不是unknown的串口 sudo putty...

【CS144】Lab5与Lab6总结

Lab5与Lab6Lab汇总Lab5概述Lab6概述由于Lab5和Lab6相对比较简单&#xff08;跟着文档一步一步写就行&#xff09;&#xff0c;于是放在一起做一个简单概述&#xff08;主要是懒得写了…&#xff09; Lab汇总 Lab5概述 lab5要求实现一个IP与Ethernet&#xff08;以太网&#x…...

GDScript 导出变量 (Godot4.0)

概述 导出变量的功能在3.x版本中也是有的&#xff0c;但是4.0版本对其进行了语法上的改进。 导出变量在日常的游戏制作中提供节点的自定义参数化调节功能时非常有用&#xff0c;除此之外还用于自定义资源。 本文是&#xff08;Bilibili巽星石&#xff09;在4.0官方文档《GDScr…...

shell:#!/usr/bin/env python作用是什么

我们经常会在别人的脚本文件里看到第一行是下面这样 #!/usr/bin/python或者 #!/usr/bin/env python 那么他们有什么用呢&#xff1f; 要理解它&#xff0c;得把这一行语句拆成两部分。 第一部分是 #! 第二部分是 /usr/bin/python 或者 /usr/bin/env python 关于 #! 这个…...

计算机行业AIGC算力时代系列报告-ChatGPT芯片算力:研究框架

报告下载&#xff1a; 计算机行业AIGC算力时代系列报告-ChatGPT芯片算力&#xff1a;研究框架 简介 “AI算力时代已经来临&#xff0c;计算机行业正在经历着一场前所未有的变革&#xff01;” 这是一个充满活力和兴奋的时代&#xff0c;人工智能&#xff08;AI&#xff09;已…...

『MyBatis技术内幕』源码调试前提

准备源代码包 下载源代码 3.4.6 版本 https://github.com/mybatis/mybatis-3/releases?page2 通过 idea 导入然后回自动下载所有依赖&#xff0c;根据 3.4.6 版本的 pom.xml 找到依赖的 mybatis-parent 版本 <parent><groupId>org.mybatis</groupId><ar…...

# Linux最新2022年面试题大汇总,附答案

# Linux最新2022年面试题大汇总&#xff0c;附答案 ### [1、cp&#xff08;copy单词缩写&#xff0c;复制功能&#xff09;](最新2021年面试题大汇总&#xff0c;附答案.md#1cpcopy单词缩写复制功能) cp /opt/java/java.log /opt/logs/ ;把java.log 复制到/opt/logs/下 cp /…...

css中重难点整理

一、vertical-align 在学习vertical-align的时候&#xff0c;可能会很困惑。即使网上有一大推文章讲veitical-align,感觉看完好像懂了&#xff0c;等自己布局的时候用到vertical-align的时候好像对它又很陌生。这就是我在布局的时候遇到的问题。 本来vertical-align就很不好理…...

JavaScript-扫盲

文章目录1. 前言2. 第一个 JavaScript 程序3. javaScript 的基础语法3.1 变量3.2 数据类型3.3 运算符3.4 条件语句3.5 数组3.6 函数3.7 作用域3.8 对象4. WebAPI4.1 DOM 基本概念4.2 常用 DOM API4.3 事件4.4 操作元素4.5 网页版猜数字游戏4.6 留言版1. 前言 提问 java 和 java…...

bpftrace 笔记

bpftrace -e BEFIN {printf("hello world!\n");}获取调用 vfs_read 函数的进程id, 每2s打印一次 bpftrace -e kprobe:vfs_read {ID pid;} interval:s:2 {printf{"ID:%d\n", ID);}用户态调试 bpftrace -e uprobe:/*/a.out:and {printf("ID:%d\n&qu…...

DELL-Vostro-5468电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板DELL-Vostro-5468处理器Intel Core i3-7100U 2.40 GHz, 3M Cache已驱动内存Samsung 8GB DDR4-2133MHz已驱动硬盘TOPMORE CAPRICORNUS NVMe 1TB已驱动显卡Intel HD Graphics 620已驱动声卡Realtek ALC2…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...