并发编程 - 线程同步(三)之原子操作Interlocked简介

news/2025/2/5 18:00:45/文章来源:https://www.cnblogs.com/hugogoos/p/18699934

上一章我们了解了3种处理多线程中共享资源安全的方法,今天我们将更近一步,学习一种针对简单线程同步场景的解决方案——Interlocked。

在此之前我们先学习一个概念——原子操作。

01、原子操作

原子操作,其概念源于化学领域,原子是构成化学元素的普通物质的最小单位;原子也是化学变化中最小的粒子及元素化学性质的最小单位。

借鉴到编程语言中原子操作指:不可分割的操作单元,是指一类不可中断的操作,它在执行时要么全部执行,要么全部不执行,不会被其他操作打断,而执行结果要么全部成功,要不全部失败,没有其他状态。

我们再回忆一下我们学习线程同步的目的——确保多个线程在访问共享资源时能够按顺序、安全地进行操作,从而避免并发执行带来的数据竞争不一致的状态。

可以说原子操作天然的解决了多线程共享资源安全问题。

在C#语言中,Interlocked类提供了一系列可以进行原子操作的工具。

02、Interlocked实现原理

Interlocked的原子操作是基于CPU本身实现,是硬件级别的原子指令封装,并且它不需要显式的线程阻塞,因此比传统的锁机制(如互斥锁、信号量等)效率更高,尤其是在高并发的场景下。

线程阻塞是指操作系统把当前线程从运行状态变更为阻塞状态,并且操作系统会把当前线程占用的CPU时间片分配给其他线程,使当前线程尽可能少的占用CPU时间。在分配CPU时间片时会涉及上下文切换等操作。

因此Interlocked的非阻塞特性,严格意义上来说并不是锁,但是效率却比锁高得多。

另外如果一个方法在CPU层面上被设计为对立不可分割的指令,那么它本质上就是原子的,严格的原子性可以阻止任何抢占的可能。因此在32位CPU中,一个操作数的大小为32位,因此可以提供32位即4个字节大小及以内的数据类型(如int,float)进行读写的原子操作。同理64位CPU,则可以提供64位级8个字节大小及以内的数据类型(如long,double)进行读写的原子操作。

其实在上一章也举个一个例子,在32位CPU环境下操作long类型,多线程情况下会出现线程不完全问题,因为对于32位CPU,操作一次long类型数据至少需要两个原子指令,因此就会出现线程安全问题。

03、Interlocked常用方法

Interlocked方法从.NET Framework 1.1到目前最新的.NET 9也经历了长足的发展和完善。可以总结为:支持的操作类型在增加,操作能力也再增加,由早期的简单递增、递减、替换操作到现在的复杂位操作,内存屏障操作等。

下面我们先整体了解一下Interlocked有那些方法。

  • Read: 原子的读取64位值;

  • Increment: 原子的递增指定的变量,并返回递增后的新值;

  • Decrement: 原子的递减指定的变量,并返回递减后的新值;

  • Add: 原子的对两个变量求和,将第一个变量替换为两者和,并返回操作后第一个变量的新值;

  • Exchange: 原子的交换两个变量,并返回第一个变量的原始值;

  • Exchange Exchange方法的泛型版本;

  • CompareExchange: 原子的比较第一个变量和第三个变量是否相等,如果相等,则将第一个变量替换为第二个变量值,并返回第一个变量的原始值;

  • CompareExchange CompareExchange方法的泛型版本;

  • And: 原子的对两个变量进行按位与操作,将第一个变量替换为操作结果,并返回第一个变量的原始值;

  • Or: 原子的对两个变量进行按位或操作,将第一个变量替换为操作结果,并返回第一个变量的原始值;

  • MemoryBarrier: 强制执行内存屏障,作用范围当前线程,无返回值;

  • MemoryBarrierProcessWide: 提供进程范围的内存屏障,确保任何 CPU 的读取和写入无法跨屏障移动;

后面我们将详细讲解每个方法的如何使用。

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner

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

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

相关文章

从易用性到高级分析:五款优秀报表软件盘点

本文将为大家介绍五款报表软件,详细描述它们的功能亮点和适用场景。山海鲸报表、Qlik Sense、Looker、Domo和Power BI分别在自助分析、实时数据访问、数据整合、可视化以及人工智能支持等方面展现了强大的功能。这些软件适用于不同规模的企业,能够帮助企业实现数据的可视化、…

阿里云可观测 2024 年 12 月产品动态

阿里云可观测 2024 年 12 月产品动态

pre-norm、post-norm

同一设置之下,Pre Norm结构往往更容易训练,但最终效果通常不如Post Norm参考资料 苏剑林. (Mar. 29, 2022). 《为什么Pre Norm的效果不如Post Norm? 》[Blog post]. Retrieved from https://kexue.fm/archives/9009为什么大模型结构设计中往往使用postNorm而不用preNorm?

连接VNC时出现attempting to reconnect to vnc server

参考 https://blog.csdn.net/weixin_46031767/article/details/128076399 使用VNC View连接kvm虚拟机无法出现画面提示 Attempting to reconnect to VNc Server.. Protocol error: invalid message type 255将画质调低解决该问题

【FMC173】l基于VITA57.1标准的4通道4GSPS AD采集、4通道12GSPS DA回放FMC子卡模块

产品概述 FMC173是一款基于VITA57.1标准的,实现4路12-bit、4GSPS ADC采集功能、4路16-bit 12GSPS DA回放的FMC子卡模块。该模块遵循VITA57.1(HPC)标准,搭配FPGA载板可以灵活的实现多通道高速采集与回放功能。模块的主芯片采用ADI公司高度集成的AD9081芯片,该芯片与ADI公司…

数字化办公新宠:文档协作工具如何重塑团队协作?

文档协作工具以其强大的功能为团队管理者带来了诸多便利。在选择适合的工具时,团队管理者应根据团队规模、需求以及预算等因素进行综合考虑。同时,还应关注工具的安全性、易用性以及与其他应用程序或系统的集成能力等方面。通过合理利用文档协作工具的功能优势,团队管理者可…

腾讯云HAI服务器上部署与调用DeepSeek-R1大模型的实战指南

上次我们大概了解了一下 DeepSeek-R1 大模型,并简单提及了 Ollama 的一些基本信息。今天,我们将深入实际操作,利用腾讯云的 HAI 服务器进行 5 分钟部署,并实现本地 DeepSeek-R1 大模型的实时调用。接下来,我们直接进入部署过程。 服务器准备 首先,我们需要登录腾讯云平台…

d2l-ResNet

动手学深度学习笔记-ResNet残差网络 ResNet 核心思想:每个附加层应该更容易地包含原始函数x作为其元素之一。

阮梅

气质温婉优雅的学者,「天才俱乐部」#81号会员,生命科学领域的专家。 凭借天赋与惊人的执著得到了博识尊的瞩目,在秘密的角落开始了对生命本源的研究与探索。 并因此被黑塔邀请,同螺丝咕姆、斯蒂芬联合开发了「模拟宇宙」。 私下里,她十分喜爱传统戏剧与点心,对刺绣也很感…

多头潜在注意力(Multi-Head Latent Attention,MLA)

在 DeepSeek 模型中,多头潜在注意力(Multi-Head Latent Attention,MLA) 是一种关键技术,旨在通过低秩压缩方法优化注意力机制的计算效率和内存使用。MLA 通过对键(Key)和值(Value)进行低秩联合压缩,显著减少了推理过程中的键值缓存(KV Cache),在保持模型性能的同时…

nexttrace :一款开源可视化的路由追踪工具

一、文章来源 今天要给大家推荐一个 GitHub 开源项目 sjlleo/nexttrace,该项目在 GitHub 有超过 700 Star,用一句话介绍该项目就是:“An open source visual route tracking CLI tool”,一款开源可视化的路由追踪工具。 https://www.ajmwz.com/15965.html二、工具介绍 next…

scroll-view标签滚动条

在nuiapp里做滑动tab时用scroll-view标签会出现滚动条情况,以下为搜索结果:但是只有第四个有效: 在微信小程序中,<scroll-view> 组件的 scrollbar-width 属性确实可以用来隐藏滚动条,但有时可能会因为平台或版本差异导致该属性无效。如果 scrollbar-width="0&q…