3. 线程间共享数据

 1. 线程共享数据会造成什么问题?

1.1 读写不一致

多线程读不会造成数据变动,所以没有问题。只要有一个线程设计修改数据,就会导致数据共享出现问题,简单的是数据不一致,严重的是程序访问已经释放的内存,造成程序崩溃。

1.2 顺序不一致(竞态条件)

1.2.1 为什么要有顺序性问题?

因为,读写操作的不同,不同的访问顺序是是十分重要的。

1.2.2  造成顺序性问题的原因?

因为,需要改动多处数据,造成必须要保证改动多出数据时每一步的连续(一个线程多处改动,多次改动,都必须抢占cpu,不能允许其他线程在这个过程被其他线程修改)

1.2.3 如何防止恶性的条件竞争?

什么是恶性竞争?可以理解为破坏程序,导致程序崩溃的,读写不一致程序还能运行,如果释放指针,访问已经释放的地址导致内存崩溃。

防止恶性竞争的方式有:

  1. 修改数据时,每一步动作不被其他线程抢占。(常见的有:互斥锁)
  2. 使用事务,也就是原子操作。(mysql的事务,redis中lua脚本)

2. 互斥方式保护共享数据

2.1 互斥锁

通过std::mutex,然后调用lock和unlock函数。但是通过unlock,则需要在每一个访问共享数据的线程上都调用unlock,同时也要注意抛出异常的问题,所以采用了基于RAII机制lock_guard()函数,构造时加锁,析构时释放锁。

缺点:一旦有暴漏的引用或者指针,那么访问加锁后,仍然能够被访问(可以推导出,加锁并不是锁内存,很可能就是锁变量的访问)。就是:你要访问共享变量,你就需要对所有的访问共享变量的环节都互斥锁,进行访问,不然的话如果通过指针或者引用去访问内存时,是无法解决这个问题的。

class some_data
{int a;std::string b;
public:void do_something();
};class data_wrapper
{
private:some_data data;std::mutex m;
public:template<typename Function>void process_data(Function func)  {std::lock_guard<std::mutex> l(m);func(data);   1.受保护的线程安全的函数,如果多线程访问该函数的时候,就一定线程安全,因为使用了互斥锁。}
};some_data* unprotected;void malicious_function(some_data& protected_data)
{unprotected=&protected_data;
}data_wrapper x;void foo()
{x.process_data(malicious_function);   2.如果你某天添加功能,以引用或者指针的方式向外部调用恭喜那个变量,这个时候就是非线程安全了,因为malicious_function是非线程安全的。unprotected->do_something();   以无保护方式访问本应受保护的共享数据
}

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

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

相关文章

JAVA垃圾回收算法和判断垃圾的算法

一、判断垃圾的算法 判断对象是否为垃圾的核心是确定对象是否不再被使用。Java主要采用以下两种算法&#xff1a; 1. 引用计数法&#xff08;Reference Counting&#xff09; 原理&#xff1a;每个对象维护一个引用计数器&#xff0c;记录被引用的次数。当引用被添加时计数器…

界面架构 - MVVM (Qt)

MVVM MVVM 的主要特点示例示例功能示例代码ViewModel 类&#xff08;C&#xff09;主函数入口&#xff08;main.cpp&#xff09; QML 文件&#xff08;main.qml&#xff09;总结 MVVM&#xff08;Model-View-ViewModel&#xff09;架构是一种旨在进一步分离界面和业务逻辑的设计…

第十四届MathorCup高校数学建模挑战赛-C题:基于 LSTM-ARIMA 和整数规划的货量预测与人员排班模型

目录 摘要 一、 问题重述 1.1 背景知识 1.2 问题描述 二、 问题分析 2.1 对问题一的分析 2.2 对问题二的分析 2.3 对问题三的分析 2.4 对问题四的分析 三、 模型假设 四、 符号说明 五、 问题一模型的建立与求解 5.1 数据预处理 5.2 基于 LSTM 的日货量预测模型 5.3 日货量预测…

银河麒麟V10 aarch64架构安装mysql教程

国产操作系统 ky10.aarch64 因为是arm架构&#xff0c;故选择mysql8&#xff0c;推荐安装8.0.28版本 尝试8.0.30和8.0.41版本均未成功&#xff0c;原因不明☹️ 1. 准备工作 ⏬ 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 2. 清理历史环境 不用管…

C++多继承

可以用多个基类来派生一个类。 格式为&#xff1a; class 类名:类名1,…, 类名n { private: … &#xff1b; //私有成员说明; public: … &#xff1b; //公有成员说明; protected: … &#xff1b; //保护的成员说明; }; class D: public A, protected B, private C { …//派…

某地老旧房屋自动化监测项目

1. 项目简介 自从上个世纪90年代以来&#xff0c;我国经济发展迅猛&#xff0c;在此期间大量建筑平地而起&#xff0c;并且多为砖混结构的住房&#xff0c;使用寿命通常约为30-50年&#xff0c;钢筋混凝土结构&#xff0c;钢结构等高层建筑&#xff0c;这些建筑在一般情况下的…

产品经理的大语言模型课 04 -模型应用的云、边、端模式对比

目录 算力部署方式的影响因素数据量计算难度前期投入数据隐私应用规模与泛化能力 云、边、端部署的特点和对比典型场景举例社区人脸门禁后厨老鼠识别 未来展望 算力部署方式的影响因素 最近和人工智能从业者进行了非常广泛的沟通&#xff0c;尝试对模型应用的云、边、端模式进…

基于Python设计的TEQC数据质量可视化分析软件

标题:基于Python设计的TEQC数据质量可视化分析软件 内容:1.摘要 本文旨在设计一款基于Python的TEQC数据质量可视化分析软件。随着全球导航卫星系统&#xff08;GNSS&#xff09;的广泛应用&#xff0c;数据质量的评估变得至关重要。TEQC&#xff08;TransEditQualityCheck&…

Flinksql--订单宽表

参考&#xff1a; https://chbxw.blog.csdn.net/article/details/115078261 (datastream 实现) 一、ODS 模拟订单表及订单明细表 CREATE TABLE orders (order_id STRING,user_id STRING,order_time TIMESTAMP(3),-- 定义事件时间及 Watermark&#xff08;允许5秒乱序&#x…

粒子滤波介绍

目录 粒子滤波的主要流程可以分为以下 5 个步骤&#xff1a; 粒子滤波&#xff08;PF&#xff09; vs. ESKF&#xff08;误差状态卡尔曼滤波&#xff09; 粒子滤波的主要流程可以分为以下 5 个步骤&#xff1a; 初始化&#xff08;Initialization&#xff09; 生成 N 个粒子&…

一场国际安全厂商的交流会议简记

今天参与了一场国际安全厂商A公司组织的交流会议 与会有国际TOP企业跨境企业 还有国内一些头部商业公司。 A公司很有意思介绍了自己是怎么做安全运营中心SOC的。 介绍了很多内容&#xff0c;包括他们自己的员工量/设备量/事件量/SOC中心人员量&#xff0c;其中人员量只有个位数…

Java面试黄金宝典30

1. 请详细列举 30 条常用 SQL 优化方法 定义 SQL 优化是指通过对 SQL 语句、数据库表结构、索引等进行调整和改进&#xff0c;以提高 SQL 查询的执行效率&#xff0c;减少系统资源消耗&#xff0c;提升数据库整体性能的一系列操作。 要点 从索引运用、查询语句结构优化、数据…

花洒洗澡完毕并关闭后过段时间会突然滴水的原因探究

洗澡完毕后的残留水 在洗澡的过程中&#xff0c;我们通常会使用到大量的水。这些水会通过花洒管子到达花洒顶喷流出。由于大顶喷花洒的喷头较大&#xff0c;关闭后里面的存水会更多。 气压失衡后的滴水 当花洒关闭后&#xff0c;内部的水管和花洒头中仍存有一定量的水。由于…

QSettings用法实战(相机配置文件的写入和读取)

很多情况&#xff0c;在做项目开发的时候&#xff0c;将参数独立出来是比较好的方法 例如&#xff1a;相机的曝光次数、曝光时长等参数&#xff0c;独立成ini文件&#xff0c;用户可以在外面修改即可生效&#xff0c;无需在动代码重新编译等工作 QSettings便可以实现该功能 内…

运维培训班之最佳选择(The best Choice for Operation and Maintenance Training Courses)

运维培训班之最佳选择 从面试官的角度聊聊培训班对运维的帮助&#xff0c;同时给培训班出身的运维一些建议~ 谈到运维&#xff08;尤其是零基础非科班转行的运维&#xff09;找工作&#xff0c;培训班是个不可回避的讨论热点。虽然本人也做过兼职运维培训老师&#xff0c;多少…

网络安全与防护策略

随着信息技术的飞速发展&#xff0c;互联网已成为现代社会不可或缺的一部分。从日常生活到企业运营&#xff0c;几乎所有活动都离不开网络。然而&#xff0c;网络的开放性和广泛性也使得网络安全问题愈发严峻。无论是个人数据泄露&#xff0c;还是大规模的网络攻击&#xff0c;…

LLM 分词器Tokenizer 如何从 0 到 1 训练出来

写在前面 大型语言模型(LLM)处理的是人类的自然语言,但计算机本质上只能理解数字。Tokenizer(分词器) 就是架在自然语言和计算机数字表示之间的一座至关重要的桥梁。它负责将我们输入的文本字符串分解成模型能够理解的最小单元——Token,并将这些 Token 转换成对应的数字…

【ArcGIS微课1000例】0142:如何从谷歌地球保存高清影像图片

文章目录 一、选取影像区域1. 搜索地图区域2. 导入矢量范围二、添加输出图层三、保存高清影像1. 地图选项2. 输出分辨率3. 保存图像四、注意事项一、选取影像区域 首先需要选取影像区域,可通过以下方式快速定位。 1. 搜索地图区域 在搜索框内输入关键词,例如青海湖,点击【…

Unity注册表修改分辨率:探索幕后设置与手动调控

Unity注册表修改分辨率&#xff1a;探索幕后设置与手动调控 在Unity开发中&#xff0c;调整分辨率和显示模式是开发过程中常见的需求&#xff0c;尤其是当我们打包并运行应用时&#xff0c;可能会遇到显示模式不符合预期的情况。Unity在首次运行时会自动保存这些设置&#xff…

外部流输入的 Layer

在 Android 的 SurfaceFlinger 体系中&#xff0c;外部流输入的 Layer 通常通过 Sideband Stream 或 BufferQueue 机制传递给 SurfaceFlinger&#xff0c;然后由 HWC&#xff08;Hardware Composer&#xff09;或 OpenGL ES 进行合成。 1. 什么是外部流输入的 Layer&#xff1f…