前言

焦虑与恐惧,往往是是因为想要的太多,但行动却太少。将目标放低,制定足以达到目标的计划,并付之于一步一个脚印的行动。当你确信你在前进的时候,自然就不会焦虑;当你的行动为你积累了足够多的正向改变的时候,自然就不会恐惧;当量变中迸发出那么一星星的质变时,你将变的自信。

足够强大,你才会自信。自信来源于强大的内心,强大的自己

开始

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相关推荐

  1. 秒杀多线程第三篇 原子操作 Interlocked系列函数

    上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...

  2. windows线程同步-原子操作-Interlocked系列函数(用户模式)

    Interlocked系列函数用来保证原子访问. InterlockedExchangeAdd提供保证long类型的原子操作. InterlockedExchangeAdd64提供long long ...

  3. WaitForMultipleObjects函数及原子操作Interlocked系列函数

    先说一说这一篇用到的多线程等待函数:如下 WaitForMultipleObjects(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD ...

  4. 多线程笔记--原子操作Interlocked系列函数

    前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序 ...

  5. C#原子操作(Interlocked.Decrement和Interlocked.Increment)

    一.概念 在多线程环境中,不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程). 二.类 System.Threadin ...

  6. windows多线程--原子操作

    推荐参考博客:秒杀多线程第三篇 原子操作 Interlocked系列函数 原子操作 VS 非原子操作 原子操作就是不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程切 ...

  7. CreateThread 和_beginthreadex区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  8. 多线程之 CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  9. Golang的CSP很酷?其实.NET也可以轻松完成

    CSP(Communicating sequential processes) 这东西我一开始以为很简单,后面差了资料发现它独树一帜,自己是一门语言,也是一套理论.这边我不深入的对它做过多的见解,我怕 ...

最新文章

  1. mysql 日期时间格式化字符串_MySQL日期函数与日期转换格式化函数大全
  2. Package xxx is not available, but is referred to by another package
  3. PHP算法 《树形结构》 之 伸展树(1) - 基本概念
  4. MapReduce基础开发之十一DistributedCache使用
  5. 解锁新的“维权方式”?车主放花圈维权!特斯拉大怒:低俗方法滋事
  6. java中identifiers什么意思_javassist.是什么意思
  7. 如何隐藏地址栏中的真实地址_如何删除Chrome地址栏记录?
  8. 對比加班時間和考勤時間,得出實際加班時長函数
  9. Matlab2017a汉化版软件详细安装教程
  10. php下获取客户端IP
  11. 激光共聚焦如何选择荧光染料
  12. hadoop 运行过程中出现Call to localhost/127.0.0.1:9000 failed on connection exception错误。
  13. 微软打击盗版的“三部曲”
  14. 魔兽三界血歌鸿蒙武器怎么合成,魔兽RPG剑域N3剧情攻略 特殊副本武器合成指南[多图]...
  15. 安卓手机续航测试软件,10款手机电池续航测试对决:都是骁龙865手机,续航差距有多大?...
  16. 群晖硬盘扩容 逃课方法
  17. VS2015安装失败——系统找不到指定路径
  18. openstack部署及使用过程中遇到的问题汇总
  19. c语言求两个数的乘积和商,输入两个整数,求出它们的商数
  20. 解决双显卡笔记本安装XP系统后独立显卡无法驱动的问题!Win7双显卡笔记本换XP系统如何安装独立显卡驱动!

热门文章

  1. 计算机应用基础精品课程申报表,计算机应用基础精品课程申报书.doc
  2. HTML5期末大作业——HTML+CSS+JavaScript平遥古城旅游景点介绍(6页)
  3. DRV8432驱动三相电机
  4. 订单23系统服务器,《死亡搁浅》攻略——第3节:芙拉吉尔 订单23.寻物:系统服务器...
  5. 微信小程序轮播图、焦点图-swiper
  6. Windows与Linux的MYSQL UDF提权分析
  7. 解决idea maven reimport失效问题
  8. BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
  9. 区块链学习名词详解-Part1
  10. C++程序设计案例实训教程第8章