• 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#教程 > 深入多线程之:内存栅栏与volatile关键字的使用分析

深入多线程之:内存栅栏与volatile关键字的使用分析

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

通过本文主要向大家介绍了volatile 多线程,volatile线程安全,volatile,volatile关键字,volatile是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

以前我们说过在一些简单的例子中,比如为一个字段赋值或递增该字段,我们需要对线程进行同步,
虽然lock可以满足我们的需要,但是一个竞争锁一定会导致阻塞,然后忍受线程上下文切换和调度的开销,在一些高并发和性能比较关键的地方,这些是不能忍受的。
.net framework 提供了非阻塞同步构造,为一些简单的操作提高了性能,它甚至都没有阻塞,暂停,和等待线程。

Memory Barriers and Volatility (内存栅栏和易失字段 )
考虑下下面的代码:

回答是“yes”,基于以下原因:
    编译器,clr 或 cpu 可能会为了性能而重新为程序的指令进行排序,例如可能会将方法A中的两句代码的顺序进行调整。
    编译器,clr 或 cpu 可能会为变量的赋值采用缓存策略,这样这些变量就不会立即对其他变量可见了,例如方法A中的变量赋值,不会立即刷新到内存中,变量B看到的变量并不是最新的值。

C# 和运行时非常小心的保证这些优化策略不会影响正常的单线程的代码和在多线程环境下加锁的代码。
除此之外,你必须显示的通过创建内存屏障(Memory fences) 来限制指令重新排序和读写缓存对程序造成的影响。

Full fences:

最简单的完全栅栏的方法莫过于使用Thread.MemoryBarrier方法了。

以下是msdn的解释:
Thread.MemoryBarrier: 按如下方式同步内存访问:执行当前线程的处理器在对指令重新排序时,不能采用先执行 MemoryBarrier 调用之后的内存访问,再执行 MemoryBarrier 调用之前的内存访问的方式。
按照我个人的理解:就是写完数据之后,调用MemoryBarrier,数据就会立即刷新,另外在读取数据之前调用MemoryBarrier可以确保读取的数据是最新的,并且处理器对MemoryBarrier的优化小心处理。

    C# Lock 语句(Monitor.Enter / Monitor.Exit)
    在Interlocked类的所有方法。
    使用线程池的异步回调,包括异步的委托,APM 回调,和 Task continuations.
    在一个信号构造中的发送(Settings)和等待(waiting)

你不需要对每一个变量的读写都使用完全栅栏,假设你有三个answer 字段,我们仍然可以使用4个栅栏。例如:
</div&g

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

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

  • 深入多线程之:内存栅栏与volatile关键字的使用分析

相关文章

  • 2017-05-28C# 3DES加密详解
  • 2017-05-28C#中属性和成员变量的区别说明
  • 2017-05-28c#使用wmi查询usb设备信息示例
  • 2017-05-28C#实现流程图设计器
  • 2017-05-28WinForm中的登录实现
  • 2017-05-28C#操作LINQ to SQL组件进行数据库建模的基本教程
  • 2017-05-28C#简单实现显示中文格式星期几的方法
  • 2017-05-28基于C#的音乐播放器主Form实现代码
  • 2017-05-28C#基础之委托用法实例教程
  • 2017-05-28c#使用filesystemwatcher实时监控文件目录的添加和删除

文章分类

  • 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#实现绘制面形图表的方法详解
    • C#实现身份证号码验证的方法
    • 简单了解C#设计模式编程中的桥接模式
    • C#实现的中国移动官网手机号码采集器
    • C#判断指定驱动器是否已经准备就绪的方法
    • C#自定义字符串替换Replace方法实例
    • C# 透明窗体制作实现方法比较分析
    • C#之CLR内存字符串常量池(string)
    • HttpWebRequest出错.Section=ResponseHeader Detail=CR

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

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