• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 深入多线程之:深入分析Interlocked

深入多线程之:深入分析Interlocked

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了interlocked,interlockedincrement,interlockedexchange,interlocked攻略,c interlocked等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤:

       一:将实例变量中的值加载到寄存器中。

       二:增加或减少该值。

       三:在实例变量中存储该值。

在多线程环境下,线程会在执行完前两个步骤后被抢先。然后由另一个线程执行所有三个步骤,当第一个线程重新开始执行时,它覆盖实例变量中的值,造成第二个线程执行增减操作的结果丢失。

Interlocked可以为多个线程共享的变量提供原子操作。

    Interlocked.Increment:以原子操作的形式递增指定变量的值并存储结果。
    Interlocked.Decrement以原子操作的形式递减指定变量的值并存储结果。
    Interlocked.Add以原子操作的形式,添加两个整数并用两者的和替换第一个整数

但是Interlocked并没有为乘法,除法提供原子操作。那么如何实现乘法,除法,以及为其他的一些非原子操作提供原子操作的支持呢??


关键就在于Interlocked.CompareExchange 中,Jeffrey Richter把它叫做InterLocked Anything 模式。

下面我们使用Interlocked.CompareExchange 实现求最大值的原子操作。

            do
            {
                startVal = currentVal; //将currentVal中的值保存到startVal中,此时记录的是target在操作开始前的最初值。
                desiredVal = Math.Max(startVal, value); //通过startVal进行复杂的计算,返回一个期望的结果,在这里仅仅是返回两者的最大值。

                //线程可能在这里被抢占,target的值可能被改变
                //如果target的值被改变了,那么target和startVal的值就不想等,所以就不应该用desiredVal替换target.
                //如果target的值没有被改变,那么target和startVal的值就像等,使用desiredVal替换target.
                //不管替换或者不替换,CompareExchange的返回值始终是target的值,所以currentVal的值现在是target的最新值。

                //CompareExchange:将target和startVal的值比较,相等则用desiredVal替换,否则不操作,
                //不管替换还是不替换返回的都是原来保存在target的值。
                currentVal = Interlocked.CompareExchange(ref target, desiredVal, startVal);
            } while (startVal != currentVal); //当target的起始值和最新值不相等的时候,说明target被修改了,所以继续下次判断,否则退出循环。
            return desiredVal;
        }
</div>
这段代码的核心就是:currentVal = Interlocked.CompareExchange(ref target, desiredVal, startVal);
// 将target的值和startVal的值比较,相等则用desiredVal替换target,否则不操作,
//不管替换还是不替换返回的都是原来保存在target的值。

在这里,计算可能会比较复杂,而不像上面的Math.Max一样,所以可以使用委托调用的方式进行封装。

        static TResult Morph<TResult, TArgument>(ref int target, TArgument argument,
            Morpher<TResult, TArgument> morpher)
        {
            TResult morphResult;

            int currentVal = target, startVal, desiredVal;

            do
            {
                startVal = currentVal;
                desiredVal = morpher(startVal, argument, out morphResult);
                currentVal = Interlocked.CompareExchange(ref target, desiredVal, startVal);
            } while (startVal != currentVal);

            return morphResult;
        }
</div>
基本原理和上面的一致。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#中使用Interlocked进行原子操作的技巧
  • .NET中保证线程安全的高级方法Interlocked类使用介绍
  • 深入多线程之:深入分析Interlocked

相关文章

  • 2017-05-28c# winform取消右上角关闭按钮的实现方法
  • 2017-05-28C#无损高质量压缩图片代码
  • 2017-05-28通俗易懂的C#之反射教程
  • 2017-05-28提权函数之RtlAdjustPrivilege()使用说明
  • 2017-05-28C# 线程同步详解
  • 2017-05-28C#中设计、使用Fluent API
  • 2017-05-28C#中List〈string〉和string[]数组之间的相互转换
  • 2017-05-28C#递归读取XML菜单数据的方法
  • 2017-05-28C#避免回溯方法心得
  • 2017-05-28DevExpress实现GridControl列头绘制Checkbox的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#控制键盘按键的常用方法
    • C#实现关机重启及注销实例代码
    • Log4Net 日志配置[附带源码下载]
    • C#为配置文件加密的实现方法
    • c#异步操作后台运行(backgroundworker类)示例
    • 30分钟LINQ教程
    • javascript函数中执行c#函数的方法
    • C#精确计算年龄的方法分析
    • C#多线程编程中的锁系统(三)
    • 利用微软com组件mstscax.dll实现window7远程桌面功能

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有