多线程之线程安全(Thread Safety)

2023-05-16

什么是线程安全(Thread Safety)?怎样才能做到线程安全?


线程安全

线程安全指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。数据类型或静态方法在多个线程中使用时,无论线程如何执行,并且不需要调用代码进行额外的协调,都能够正确表现,则该方法是线程安全的。其中:

  • 正确表现:指满足变量或方法的特定功能,并且能保持它的不变性。
  • 无论线程如何执行:指多线程在多个处理器上执行或者以时间片轮转方式在单个处理器上执行
  • 额外的协调:指数据类型不能在其调用者上设置与定时有关的前提条件,例如在 s e t ( ) set() set()进行的过程中不能调用 g e t ( ) get() get()

实现方法

  • 线程封闭(Confinement)

    共享可变数据是产生竞争的根源,通过限制可变数据的共享就可解决这个问题:

    • 共享数据本地化

      一个实现方法就是将共享变量本地化,每个线程都有该共享变量的私有副本。

    • 避免使用全局变量

      与本地变量不同,静态变量不会自动地被线程限制,如果程序里存在静态变量,就必须注明只有一个线程能使用它。所以最好能完全消除静态变量。

  • 使用不可变数据(Immutability)

    不可变数据是指一旦创建后状态不可改变的数据。这意味着共享只读数据,同时能获得线程安全性。然后可以通过这样的方式实现可变(非const)操作,即创建新对象而不是修改现有对象。这种方法是函数式编程的特征,同时还被Java、C#和Python中的字符串实现所使用。

  • 使用线程安全的数据类型(Threadsafe data type)

    使用线程安全的数据结构去存储共享可变数据,例如Java中的StringBuffer :该类型是线程安全的,在必要时会进行同步以使所有对它的操作能够以串行的方式进行,从而避免竞争。

  • 同步(Synchronization)

    该方法在无法避免共享可变数据的情况下使用。

    • 互斥(Mutual exclusion)

      对共享数据的访问使用进行序列化可确保在任何时间只有一个线程读取或写入共享数据的机制。由于不当使用会导致死锁、活锁和饥饿等问题,因此需要仔细考虑合并互斥的问题。

    • 原子操作(Atomic operations)

      通过原子操作可以访问共享数据,且该原子操作不能被其他线程中断。通常需要使用特殊的机器指令来实现,这些指令可能在运行时库(RTL)中提供。由于操作是原子操作,因此无论其他线程如何访问,共享数据始终保持有效状态。

参考链接:

  • https://web.mit.edu/6.005/www/fa15/classes/20-thread-safety/#what_threadsafe_means
  • https://en.wikipedia.org/wiki/Thread_safety
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程之线程安全(Thread Safety) 的相关文章

  • 伺服电机控制

    前言 xff1a 感谢各位大佬愿意将知识开源并作出详细的说明 我只是依据自己的学习轨迹稍作整理 xff0c 加以自己的理解并记录于此 本文几乎所有的参考内容都附上了原文链接 xff0c 本文的文字内容有一些是我的 xff0c 有一些是从链接
  • 永磁同步电机的MATLAB建模

    建模是为了能够确定我们输入怎样的电压能得到怎样的转矩 xff0c 以获得怎样的转速 电机这个东西 xff0c 输出的不是位移也不是速度 xff0c 我们要看的输出是力矩 xff0c 力矩够大才有位移才有速度 xff0c 没有位移没有速度的时
  • SVPWM的MATLAB建模

    异步电机矢量控制20讲 xff1a SVPWM的simulink仿真 xff08 总第38讲 xff09 扇区判断 注意 xff0c 这个N是二进制转来的十进制数 波形对应出来的扇区是 5 6 1 2 3 4 如果改变三相电压输入的相位 x
  • Java要素察觉

    简介 xff1a 主要内容来源于b站刘二大人Java课程 xff0c 旨在记录课程中的重要内容 Java课程记录 xff08 课程号作为标题 xff09 02 数据类型03 数组与字符串05 类与对象07 继承08 方法重载 方法重写和多态
  • vscode配置gitee(码云)实现步骤

    第一步 1 百度搜索Git xff0c 出现的第一个网站 xff08 如下图 xff09 Git xff09 2 下载 3 下载之后 双击安装 xff08 安装过程中只需要默认下一步 不需要多余操作 放心大胆的点击下一步 xff09 第二步
  • ROS读取MPU6050数据

    上一篇讲到使用I2C连接Jetson Nano和MPU6050并使用python读取 xff0c 本次基于roscpp连接读取IMU数据 RTIMULib RTIMULib是本次使用的IMU库 xff0c 支持多种常见的IMU模块 xff0
  • 关于navicat报错:Server unexpectedly closed network connection

    破解navicat后 使用navicat连接本地虚拟机 发现出现以下错误 在百度以及谷歌上面查找很多博客 发现我这里的报错信息跟他们不一样 解决方法 1 打开本地虚拟机 进入mysql mysql span class token oper
  • 学会查看官方文档

    曾经经历过的误区 从刚开始接触编程开始 xff0c 基本上接触新事物 xff0c 第一件事情就是去找博客 xff0c 或者买书 往往只需要使用的一个很小的知识点 xff0c 却购买了好几本不同的书籍 事后证明 xff0c 并没有什么太大的用
  • QGroundControl如何进行二次开发

    QGroundControl如何进行二次开发 QGroundControl是一个开源的地面站软件 xff0c 你可以通过以下步骤进行二次开发 xff1a 1 下载并安装QGroundControl 首先需要从QGroundControl的官
  • C 结构体指针malloc分配问题

    C语言中关于结构体指针的内存分配问题 话不多说先上一段代码 span class token keyword typedef span span class token keyword struct span span class toke
  • 这是一个用于记录学习经验的博客

    写在前面 本科时期科研经历较少 xff0c 硕士期间越来越多地开始接触计算机相关的软件 算法 项目等 从2020年入学至今 xff0c 也学习到了一些相关的知识与经验 过去都是通过word的方式记录进展与经验 从今天起我也想尝试通过博客的方
  • ARM64架构的Linux系统中编译C++程序报错fatal error: sys/io.h: No such file or directory

    原因是不同的Linux平台的 io h 放置的位置不同 Windows下的io h直接包含即可 xff1b Linux平台下在sys文件夹下 xff1b ARM架构的系统中在sys文件夹下 xff0c 而且名字也不一样 xff0c 变成了u
  • 矩阵的QR分解

    Gram Schmidt正交化 在提到矩阵的QR分解前 xff0c 必须要提到Gram Schmidt方法 xff0c 理论上QR分解是由Gram Schmidt正交化推出来的 那么Gram Schmidt正交化究竟是什么 在三维空间存在直
  • 常见数学符号及其读法

    大写 小写 英文注音 国际音标注音 中文注音 alpha alfa 阿耳法 beta beta 贝塔 gamma gamma 伽马 deta del
  • cartographer环境配置及运行

    文章目录 1 首先安装ROS2 安装eigen33 安装ceres4 安装cartographer5 试运行总结 xff1a 系统 xff1a Ubuntu 18 04 1 首先安装ROS 在无网络限制的情况下参考官网安装 ref xff1
  • SLAM会议笔记(一)LOAM

    LOAM Lidar Odometry and Mapping in Real time ABSTRACT 将复杂的SLAM问题分离为两个算法 xff0c 一个高频低精度的运动估计 xff0c 另一个低一个数量级的点云匹配和配准算法 REL
  • 相机&IMU内参及外参标定

    1 使用工具 xff1a https github com ethz asl kalibr git 2 特点支持多个相机的内参外参标定 xff0c 即使视域没有重叠 xff1b 支持相机 amp IMU之间标定 xff1b 支持IMU与IM
  • SLAM会议笔记(二)Real-time DEMO

    Real time Depth Enhanced Monocular Odometry Abstract 利用图像和稀疏的深度图做运动估计 xff0c 同时利用三角量测和运动估计得到位置深度的突出图像特征点的深度 xff0c 使用光束平差法
  • SLAM会议笔记(三)V-LOAM

    Visual lidar Odometry and Mapping Low drift Robust and Fast Abstract 提出了一种新的使用激光雷达里程计和视觉里程计的框架 xff0c 提升了表现 xff0c 特别是在剧烈运
  • SLAM会议笔记(四)Lego-LOAM

    LeGO LOAM Lightweight and Ground Optimized Lidar Odometry and Mapping on Variable Terrain Abstract 提出一种轻量级的ground optimi

随机推荐

  • SLAM会议笔记(五)LLOAM

    LLOAM LiDAR Odometry and Mapping with Loop closure Detection Based Correction Abstract 在LOAM的基础上加入了回环检测 xff0c 实现了雷达SLAM的
  • C++基础:第三章 对象与基本类型

    文章目录 第3章 对象与基本类型第1节 初始化 赋值语句第2节 类型详述类型描述类型种类划分与类型相关的标准未定义部分变量 第3节 复合类型 xff1a 从指针到引用指针指针特点相关操作符指针的定义 96 void 96 指针指针的指针指针
  • C++基础:第四章 数组、vector和字符串

    文章目录 第4章 数组 vector和字符串第1节 数组注意事项数组的复杂声明数组中元素的访问数组到指针的隐式转换获得s指向数组开头和结尾的指针数组的其他操作C字符串多维数组 第2节 vector构造和初始化元素的索引和遍历迭代器itera
  • C++基础:第五章 表达式基础与详述

    第五章 表达式基础与详述 第1节 基础 xff1a 引入 表达式由一到多个操作数组成 xff0c 可以求值并 xff08 通常会 xff09 返回求值结果 xff08 函数的调用是一种表达式 xff0c 有时函数不会返回求值结果 xff09
  • C++基础:第六章 语句

    第六章 语句 第1节 语句基础 常见类别 xff1a 表达式语句 xff0c 求值后丢弃 2 43 3 空语句复合语句 xff0c 用大括号 xff0c 形成独立的域 顺序语句 按先后顺序执行实际执行顺序可能产生变换 xff08 编译器优化
  • C++基础:第七章 函数

    第七章 函数 第1节 函数基础 栈帧结构 函数的外部链接 第2节 函数详解 传值 传址 传引用 传参数时的类型退化 xff0c 传数组时函数形参退化成指针 xff0c 所以形参不要写数组个数 多维数组作为函数参数时 void fun int
  • C++基础:第八章 深入IO

    第八章 深入IO 第1节 序 第2节 IOStream概述 流式IO而非记录IO 处理的主要问题 表示形式的变化 xff1a 使用格式化 解析在数据的内部表示与字符序列之间切换与外部设备的通信 xff1a 针对不同的外部设备引入不同的处理逻
  • 在vscode终端安装vue构建工具vite

    首先确保已安装npm 第一步 xff1a 全局安装yarn 0 打开cmd xff08 windows 43 R xff09 1 输入安装命令 npm install g yarn 2 如果能看到版本号 xff0c 则安装成功 yarn v
  • cmake相关:sudo make install后的卸载

    sudo make install后的卸载 我们知道linux中一般的编译一个package的顺序是 span class token function git span clone package git span class token
  • 提取rosbag中的图像话题存为本地图像

    新建存放图片文件夹 首先运行ros master roscore 在目标文件夹目录下运行 rosrun image view extract images sec per frame 61 0 05 image 61 lt ROSIMAGE
  • matlab循环读取文件

    一般情况下 xff0c 假如我要读取一个名为a txt的文件 xff0c 只需要利用下面的语句 xff1a a span class token operator 61 span span class token function load
  • 使用OpenMVG获取相机位姿的方法

    在生成sfm data bin文件后 xff0c 在文件目录下执行 openMVG main ConvertSfM DataFormat binary span class token operator span i yoursfm dat
  • Ubuntu修改文件夹下面所有文件权限的方法

    ubuntu修改文件夹下所有文件的权限 命令为 xff1a sudo chmod span class token operator span R 777 filename filename为要修改的文件夹名字 R应该是表示递归修改file
  • 写出对js事件,事件流,事件对象的理解

    事件 JavaScript 使我们有能力创建动态页面 事件是可以被 JavaScript 侦测到的行为 网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件 比方说 xff0c 我们可以在用户点击某按钮时产生一个 onC
  • UDP实时图像传输

    写在前面 首先问个问题 xff0c 为什么要用UDP传输图像 xff0c 而不是TCP xff1f TCP是我们经常使用的通信协议 xff0c 从认识它的第一天起 xff0c 就应该知道 xff0c 它非常稳 xff0c 丢包率超低 但是一
  • 机器学习 | 使用k-近邻算法实现手写识别系统

    KNN概述 k 近邻算法就是通过计算不同特征值之间的距离来进行分类的算法 假设我们现在有一个样本集 xff0c 每个样本都有几个特征用来描述这个样本 xff0c 以及一个它所属分类的标签 当我们拿到一个没有标签的样本时 xff0c 该如何判
  • Windows下如何查看一个process内有哪些thread

    从https docs microsoft com en us sysinternals downloads pslist下载PsTools xff0c 解压后找到pslist exe并移动到C盘任一目录下 xff0c 使用说明都在Psto
  • 机器人路径规划之动态窗口法

    动态窗口法 Dynamic Window Approach 概述 DWA是一种基于速度的局部规划器 xff0c 可计算达到目标所需的机器人的最佳无碰撞速度 程序实现 DWA算法主要分三步 xff1a 计算动态窗口计算最优 v
  • cso(布谷鸟)算法优化神经网络参数

    之前写了一篇pso工程上使用方法 xff0c 这一篇使用布谷鸟算法 xff0c 相关的原理也比较多的介绍了 目前实验结果还是pso快一点 一 布谷鸟算法介绍 布谷鸟搜索算法 xff0c 是 由剑 桥 大 学YANG等在文献 中提出的一种群智
  • 多线程之线程安全(Thread Safety)

    什么是线程安全 Thread Safety xff1f 怎样才能做到线程安全 xff1f 线程安全 线程安全指某个函数 函数库在多线程环境中被调用时 xff0c 能够正确地处理多个线程之间的共享变量 xff0c 使程序功能正确完成 数据类型