前言

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

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

开始

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. python双星号什么运算_python – 双星号
  2. RocksDB线程局部缓存
  3. 海信电视服务器暂时不可用,一线也实惠 微星H61M-E35(B3)主板评测
  4. python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象
  5. ArcGIS实验教程——实验十:矢量数据投影变换
  6. IDEA项目搭建四——使用Mybatis实现Dao层
  7. lammps软件_Lammps模型构建的方法之一:组合模型构建
  8. Intellij IDEA 2017 如何导入 GitHub 中的项目
  9. SQL 子查询怎么优化?写的很深!
  10. 为什么以太网有最短帧长度的要求_线束工程师:车载以太网介绍
  11. 动环监控系统价格,动环监控系统价格多少
  12. Ubuntu版Julia安装与入门
  13. 计算机显卡更新,电脑显卡怎么升级,电脑显卡升级方法图解
  14. Java 服务器版超市管理系统,基于JAVA的超市进销存管理系统.doc
  15. 上海到深圳的长途搬家认识到了农业民族和航海民族的差异
  16. 信息安全系统设计基础期中总结
  17. 个人简历特长及自我评价怎么写?
  18. linux alsa驱动讲解
  19. 垃圾分类毕设java程序_北京垃圾分类首日:垃圾怎么分不用手抄,有个小程序助识别...
  20. java中.next()方法的作用及应用?

热门文章

  1. Android 闪屏页的实现
  2. CSharp代码示例每日一讲: 在GDI+中使用画笔和画刷
  3. 电脑处理文件数据丢失怎么办
  4. 3dsMax2022插件开发环境的搭建
  5. 神器如 dnSpy,无需源码也能修改 .NET 程序
  6. android studio 两个工程 引用同一个库,一个可以,另一个不可以
  7. 一周市场摘抄20210118
  8. VScode VSC Netease Music(网易云音乐)插件
  9. 盛迈坤电商:拼多多店铺怎么样推广
  10. 计算机应用基础0039答案,计算机应用基础-0039(贵州电大-课程号:5205004)参考资料.docx...