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有那些方法。

背面我们将详细讲解每个方法的如何使用。
:测试方法代码以及示例源码都已经上传至代码库,有爱好的可以看看。https://gitee.com/hugogoos/Planner

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4