避免游离指针或引用以保护共享数据

news2024/12/24 3:42:31

         在对共享数据进行保护时,有可能被外界的指针修改。如下例:

#include<iostream>
#include<thread>
#include<mutex>
#include<windows.h>

using namespace std;

class user_data
{
	public:
		int a;
		char c;
		void change_data(void) { a *= 10; c += 10; }
};

user_data* unprotected_pt;

void function(user_data &mydata)
{
	unprotected_pt = &mydata;
}

class protect_data
{
	private:
		user_data data;//保护里面的共享数据
		mutex guard_mutex;
	public:
		protect_data() { data.a = 1; data.c = 'A'; }
		void process_data(void)
		{
			lock_guard<mutex> guard(guard_mutex);//相当于加锁操作
			data.a += 10;
			data.c += 1;
            function(data);
			Sleep(5000);
		}
		void print(void)
		{
			cout << "data = " << data.a << " data.c = " << data.c << endl;
		}
};

void thread_function(protect_data &pd);

int main(void)
{
	protect_data pd;
	pd.print();
	thread t1(thread_function,ref(pd));
	thread t2(thread_function,ref(pd));

	t1.join();
	t2.join();
	pd.print();
	return 0;
}

void thread_function(protect_data &pd)
{
	pd.process_data();
}

        这样看上去是没什么问题,将变量卡在私有接口上上,并且用锁将变量卡到一个进程中。但是:这里有一个游离的指针可以访问。如下:

        用游离指针实现了修改,这是我们不想要的。因为function(data)将锁所在的作用域范围之外传递了引用和指针。

        这种方法并没有被制止的方法,只能让我们写代码时不要这样做。

        不要将受保护资源以函数指针或引用的方式将其传递在作用域之外。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Log On Yarn

序言 整理下各种部署在Yarn上的应用如何查看日志的问题.当然我觉得使用自定义的日志收集器来收集就更好了.这样子也解决了集群日志的问题cuiyaonan2000163.com 只用Flink做个引子,其它的服务也是这样的,没有什么差别 Flink 比如我们提交了一个任务同时知道他的ApplicationId…

transformer零基础学习

声明&#xff1a;以下文章链接仅用于个人学习与备忘。 基础知识 1&#xff1a;零基础解析教程 [推荐] https://zhuanlan.zhihu.com/p/609271490 2&#xff1a;Transformer 详解 [推荐] https://wmathor.com/index.php/archives/1438/ 3&#xff1a;如何从浅入深理解transfor…

Flutter开发笔记:Flutter 布局相关组件

Flutter开发笔记 Flutter 布局与布局组件 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChineAddress of this article:https://blog.csdn.net/qq_28550263/article/details/131419782 【介绍】&am…

随笔-当曾经的小弟当了你的领导,阁下该如何应对

前几天&#xff0c;从小龙那得到一个招聘信息&#xff0c;想着被优化的C朋友&#xff0c;就转发给了他。过了会C朋友给我回了信息&#xff1a; C朋友&#xff1a;入职A&#xff08;我现在的公司&#xff09;需要穿正装吗&#xff1f; 我&#xff1a;需要啊&#xff0c;办手续…

并发编程-分布式存储系统之edits_log

复杂一点的多线程编程场景&#xff0c;总结起来也就是 通过加锁来控制好标志位的状态流转&#xff0c;通过标志位的不同的流转状态&#xff0c;来控制每个线程有不同的行为如果是需要各个线程协作处理的逻辑&#xff0c;就采用最简洁的wait/notify机制 分布式存储系统 分布式存…

【软件安装】Linux系统中安装JDK1.8运行环境(Ubuntu系统)

这篇文章&#xff0c;主要介绍Linux系统中安装JDK1.8运行环境&#xff08;Ubuntu系统&#xff09;。 目录 一、Linux安装JDK运行环境 1.1、下载JDK安装包 1.2、上传JDK到Linux服务器 1.3、解压JDK安装包 1.4、配置JDK环境变量 1.5、重新加载profile环境变量 1.6、检查是…

卷积(CNN)| 反卷积(TCNN、Transposed CNN)| 卷积过程中feature map的通道变化 | 1 × 1卷积核如何降维/升维

关于深度学习中的一些小概念&#xff0c;因为网上的资源有些散乱&#xff0c;这里总结一些自己的&#xff0c;方便后面复习&#xff0c;摘一些图&#xff0c;但是会标明引用&#xff01; 一、卷积 对于卷积&#xff0c;下面一张图就够了&#xff0c;根据 stride 步长在 featur…

优维低代码实践:数据加工/转化详解

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

5大最热门云原生API Gateway

文章目录 前言&#xff1a;为什么需要API Gateway&#xff1f;一、APISIX二、Kong三、TyK四、Easegress五、Gloo六、API Gateway应该如何选择&#xff1f; 公众号&#xff1a; MCNU云原生&#xff0c;文章首发地&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;…

Windows安装使用Nacos并进行服务治理

Nacos简介 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos其实就是一个注册中心,用来管理和注册微服务 搭建Nacos环境 安装nacos(版本1.1.4) 下载网址 htt…

【AIGC】ChatGLM2-6B大模型 据称推理性能超越Chat4.0

ChatGLM2-6B ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上&#xff0c;ChatGLM2-6B 引入了如下新特性&#xff1a; 更强大的性能&#xff1a;基于 ChatGLM 初代模型的开发经验&…

Flink CDC 2.4 正式发布,新增 Vitess 数据源,更多连接器支持增量快照,升级 Debezium 版本

Flink CDC 2.4 正式发布&#xff0c;新增 Vitess 数据源&#xff0c;更多连接器支持增量快照&#xff0c;升级 Debezium 版本 1. Flink CDC 简介2. Flink CDC 2.4 概览3. 详解核心特性和重要改进3.1 深入解读3.2 其他改进 4. 未来规划 1. Flink CDC 简介 Flink CDC [1] 是基于…

皓峰防火墙存SQL注入复现

简介 深圳市皓峰通讯技术有限公司成立于2004年&#xff0c;位于深圳市高新技术产业园&#xff0c;是经过国家认定的“双软”企业和“国家高新技术企业” 登陆界面如下 复现 fofa 搜索 app"皓峰防火墙系统登录" 抓取登录的post包 POST /login.php HTTP/1.1 Host:…

专项练习13

目录 一、选择题 1、1true的返回值是true&#xff0c;这句话是否正确&#xff1f; 2、下列关于JavaScript中变量的说法&#xff0c;错误的是&#xff1f; 3、以下哪些表达式的结果为true&#xff08;&#xff09; 二、编程题 1、将数组参数中的数字从大到小进行排序并返回 一…

CVE-2023-34541 LangChain 任意命令执行

漏洞简介 LangChain是一个用于开发由语言模型驱动的应用程序的框架。 在LangChain受影响版本中&#xff0c;由于load_prompt函数加载提示文件时未对加载内容进行安全过滤&#xff0c;攻击者可通过构造包含恶意命令的提示文件&#xff0c;诱导用户加载该文件&#xff0c;即可造…

ROS:服务通信机制详解

目录 ROS&#xff1a;通信机制一、服务通信机制简介1.1概念1.2作用 二、服务通信理论模型三、服务通信自定义srv3.1目的3.2流程3.2.1创建srv文件3.2.2编辑配置文件3.2.3.编译 四、服务通信自定义srv调用(C)4.1要求4.2流程4.3vscode配置4.4服务端代码4.5客户端代码4.6配置 CMake…

知识图谱相关概念整理

文章目录 1、概论2、什么是知识图谱&#xff1f;3、知识图谱构建3.1、构建知识图谱的生命周期3.2、Schema定义3.3、知识抽取3.4、知识融合3.5、知识存储3.6、知识推理 4、图谱建设的一些经验 1、概论 知识图谱&#xff08;KnowledgeGraph&#xff09;以结构化的形式描述客观世界…

C# Winform DataGridView 控件和 DataTable

目录 一、概述 二、DataTable 的用法 1.创建表和列 2.添加行 3.取值和赋值 4.删除行 5.遍历 DataTable 6.判断 DataTable 列中是否存在某个值 7.设置主键 8.获取 DataRow 所在的行号 9.DataTable 转换为 List 10.将 List 转 DataTable 三、DataGridView 的用法 1…

记录好项目D16

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个电影购票系统 一、系统介绍 前台 普通用户注册、登录、注销 用户…

Redis哨兵——单机安装部署

Redis哨兵——单机安装部署 目录 主从配置&#xff1a; 部署redis哨兵&#xff1a; 结 果 验 证&#xff1a; 主从配置&#xff1a; 1.安装epel源&#xff1a;yum install epel-release -y 2.安装软件&#xff1a;yum install redis -y 3.新建文件夹便于验证&#xff1a;m…