C# 原子操作 Interlocked
前言
焦虑与恐惧,往往是是因为想要的太多,但行动却太少。将目标放低,制定足以达到目标的计划,并付之于一步一个脚印的行动。当你确信你在前进的时候,自然就不会焦虑;当你的行动为你积累了足够多的正向改变的时候,自然就不会恐惧;当量变中迸发出那么一星星的质变时,你将变的自信。
足够强大,你才会自信。自信来源于强大的内心,强大的自己。
开始
Interlocked 提供了方法来实现原子操作,对于多线程共享的变量来说,原子操作保证了线程安全,保证了变量值的正确性。
让我们看一个简单的例子,在下面例子中,我们 new 了 10 个 线程,并启动他们;他们各自循环10次调用 UseSharedValue 方法;在 UseSharedValue 方法中, 我们执行了 threadSharedValue++ 的操作。由于 threadSharedValue 的初始值为0,所以当程序跑完后,我们对于 threadSharedValue 的期望值为100。
using System;
using System.Threading;namespace InterlockedExchange_Example
{class MyInterlockedExchangeExampleClass{private static int threadSharedValue = 0;//每个线程内,循环10次private const int numThreadIterations = 10;//线程数为10 private const int numThreads = 10;static void Main(){Thread myThread;for (int i = 0; i < numThreads; i++){myThread = new Thread(new ThreadStart(MyThreadProc));myThread.Start();}Console.Read();}private static void MyThreadProc(){for (int i = 0; i < numThreadIterations; i++){UseSharedValue();}}static void UseSharedValue(){Thread.Sleep(100);threadSharedValue++;Thread.Sleep(100);Console.WriteLine(threadSharedValue);}}
}
可以新建控制台程序,并将上面代码复制到 Program.cs 来覆盖原来代码,然后F5运行程序。得到 threadSharedValue 的最终结果可能是 95,也可能是97,很小几率会出现我们的期望值100.
于是我们想到了这可能是因为线程之间的互相干扰导致的。可能2个线程同时执行 threadSharedValue ++ 操作,假设 threadSharedValue 当前为10,则两个线程都判断它原始值为10, ++后值为11。这种情况每出现一次,我们最终得到的 threadSharedValue 的结果就比100少1. 所以在多次执行该程序后,得到的结果总是比100少一点。
为了解决这种问题,我们想到了使用线程锁,在一个线程访问 threadSharedValue 的值时,禁止另外的线程同时访问。 .net 准备了 System.Threading.Interlocked 类 来实现原子操作,从而保证 线程共享变量 的 线程安全。
在上面的例子中,将
threadSharedValue++;
替换为
Interlocked.Increment(ref threadSharedValue);
重新执行程序,发现 threadSharedValue 的最终值 始终为 100.
Interlocked 常用方法有:
// 加1,原子操作,线程安全
Increment( ref Int32 ) ,
Increment( ref Int64 ) ,// 减1,原子操作,线程安全
Decrement( ref Int32),
Decrement( ref Int64),// 把第二个参数加到 ref 值上
Add ( ref Int32, Int32 ),
Add ( ref Int64, Int64 ),// 把第二个参数赋值给 ref 值
Exchange ( ref Int32, Int32 ),
Exchange ( ref Int64, Int64 ),
关于 Interlocked 的更多知识,可以查看官方提供的文档,本文末尾的参考文档中提供了链接地址。
参考文档
https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked?view=netframework-4.8
C# 原子操作 Interlocked相关推荐
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...
- windows线程同步-原子操作-Interlocked系列函数(用户模式)
Interlocked系列函数用来保证原子访问. InterlockedExchangeAdd提供保证long类型的原子操作. InterlockedExchangeAdd64提供long long ...
- WaitForMultipleObjects函数及原子操作Interlocked系列函数
先说一说这一篇用到的多线程等待函数:如下 WaitForMultipleObjects(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD ...
- 多线程笔记--原子操作Interlocked系列函数
前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序 ...
- C#原子操作(Interlocked.Decrement和Interlocked.Increment)
一.概念 在多线程环境中,不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程). 二.类 System.Threadin ...
- windows多线程--原子操作
推荐参考博客:秒杀多线程第三篇 原子操作 Interlocked系列函数 原子操作 VS 非原子操作 原子操作就是不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程切 ...
- CreateThread 和_beginthreadex区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...
- 多线程之 CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...
- Golang的CSP很酷?其实.NET也可以轻松完成
CSP(Communicating sequential processes) 这东西我一开始以为很简单,后面差了资料发现它独树一帜,自己是一门语言,也是一套理论.这边我不深入的对它做过多的见解,我怕 ...
最新文章
- python双星号什么运算_python – 双星号
- RocksDB线程局部缓存
- 海信电视服务器暂时不可用,一线也实惠 微星H61M-E35(B3)主板评测
- python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象
- ArcGIS实验教程——实验十:矢量数据投影变换
- IDEA项目搭建四——使用Mybatis实现Dao层
- lammps软件_Lammps模型构建的方法之一:组合模型构建
- Intellij IDEA 2017 如何导入 GitHub 中的项目
- SQL 子查询怎么优化?写的很深!
- 为什么以太网有最短帧长度的要求_线束工程师:车载以太网介绍
- 动环监控系统价格,动环监控系统价格多少
- Ubuntu版Julia安装与入门
- 计算机显卡更新,电脑显卡怎么升级,电脑显卡升级方法图解
- Java 服务器版超市管理系统,基于JAVA的超市进销存管理系统.doc
- 上海到深圳的长途搬家认识到了农业民族和航海民族的差异
- 信息安全系统设计基础期中总结
- 个人简历特长及自我评价怎么写?
- linux alsa驱动讲解
- 垃圾分类毕设java程序_北京垃圾分类首日:垃圾怎么分不用手抄,有个小程序助识别...
- java中.next()方法的作用及应用?
热门文章
- Android 闪屏页的实现
- CSharp代码示例每日一讲: 在GDI+中使用画笔和画刷
- 电脑处理文件数据丢失怎么办
- 3dsMax2022插件开发环境的搭建
- 神器如 dnSpy,无需源码也能修改 .NET 程序
- android studio 两个工程 引用同一个库,一个可以,另一个不可以
- 一周市场摘抄20210118
- VScode VSC Netease Music(网易云音乐)插件
- 盛迈坤电商:拼多多店铺怎么样推广
- 计算机应用基础0039答案,计算机应用基础-0039(贵州电大-课程号:5205004)参考资料.docx...