IT评测·应用市场-qidao123.com
标题:
并发编程 - 线程同步(三)之原子利用Interlocked简介
[打印本页]
作者:
千千梦丶琪
时间:
2025-2-12 15:00
标题:
并发编程 - 线程同步(三)之原子利用Interlocked简介
上一章我们了解了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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4