论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
并发编程 - 线程同步(三)之原子利用Interlocked简介 ...
并发编程 - 线程同步(三)之原子利用Interlocked简介
千千梦丶琪
金牌会员
|
2025-2-12 15:00:43
|
来自手机
|
显示全部楼层
|
阅读模式
楼主
主题
859
|
帖子
859
|
积分
2577
上一章我们了解了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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
千千梦丶琪
金牌会员
这个人很懒什么都没写!
楼主热帖
SQLserver的安装
【C++】ZZ1864- 解题精讲
StoneDB社区答疑第一期
一文搞清UNIX/Linux与Windows文件换行 ...
数据湖Hudi与对象存储Minio及Hive\Spar ...
C语言程序设计(一)计算机思维导论 ...
开发了一个Java库的Google Bard API, ...
Cesium 几何体贴模型 sampleHeight(二 ...
ASP.NET Core MVC 从入门到精通之自动 ...
【HarmonyOS】初识HarmonyOS
标签云
挺好的
服务器
快速回复
返回顶部
返回列表