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) 这东西我一开始以为很简单,后面差了资料发现它独树一帜,自己是一门语言,也是一套理论.这边我不深入的对它做过多的见解,我怕 ...
最新文章
- mysql 日期时间格式化字符串_MySQL日期函数与日期转换格式化函数大全
- Package xxx is not available, but is referred to by another package
- PHP算法 《树形结构》 之 伸展树(1) - 基本概念
- MapReduce基础开发之十一DistributedCache使用
- 解锁新的“维权方式”?车主放花圈维权!特斯拉大怒:低俗方法滋事
- java中identifiers什么意思_javassist.是什么意思
- 如何隐藏地址栏中的真实地址_如何删除Chrome地址栏记录?
- 對比加班時間和考勤時間,得出實際加班時長函数
- Matlab2017a汉化版软件详细安装教程
- php下获取客户端IP
- 激光共聚焦如何选择荧光染料
- hadoop 运行过程中出现Call to localhost/127.0.0.1:9000 failed on connection exception错误。
- 微软打击盗版的“三部曲”
- 魔兽三界血歌鸿蒙武器怎么合成,魔兽RPG剑域N3剧情攻略 特殊副本武器合成指南[多图]...
- 安卓手机续航测试软件,10款手机电池续航测试对决:都是骁龙865手机,续航差距有多大?...
- 群晖硬盘扩容 逃课方法
- VS2015安装失败——系统找不到指定路径
- openstack部署及使用过程中遇到的问题汇总
- c语言求两个数的乘积和商,输入两个整数,求出它们的商数
- 解决双显卡笔记本安装XP系统后独立显卡无法驱动的问题!Win7双显卡笔记本换XP系统如何安装独立显卡驱动!
热门文章
- 计算机应用基础精品课程申报表,计算机应用基础精品课程申报书.doc
- HTML5期末大作业——HTML+CSS+JavaScript平遥古城旅游景点介绍(6页)
- DRV8432驱动三相电机
- 订单23系统服务器,《死亡搁浅》攻略——第3节:芙拉吉尔 订单23.寻物:系统服务器...
- 微信小程序轮播图、焦点图-swiper
- Windows与Linux的MYSQL UDF提权分析
- 解决idea maven reimport失效问题
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
- 区块链学习名词详解-Part1
- C++程序设计案例实训教程第8章