查了下MSDN的解释:

         MemoryBarrier is required only on multiprocessor systems with weak memory ordering (for example, a system employing multiple Intel Itanium processors).Synchronizes memory access as follows: The processor executing the current thread cannot reorder instructions in such a way that memory accesses prior to the call to MemoryBarrier execute after memory accesses that follow the call to MemoryBarrier.就是说多核处理器会对运行CPU指令顺序重排优化,MemoryBarrier可以阻止指令重排,调用Thread.MemoryBarrier()之后的代码中内存访问不能再这之前就完成了。也就是它可以限制指令重排和内存读写的缓存。下面有段代码,在release编译情况下会死循环(debug应该是没做instructions reorder而不会有问题)bool complete = false;var t = new Thread(() =>{bool toggle = false;while (!complete)toggle = !toggle;});t.Start();Thread.Sleep(1000);complete = true;t.Join();

问题原因:

1.编译器、CLR或者CPU可能重新排序了程序指令,以此提高效率。

2.编译器、CLR或者CPU引入缓存优化导致其他的线程不能马上看到变量值的更改。

尝试了下将Thread.MomoryBarrier加到while中,保证complete读到的最新的:

此例子中MomoryBarrier 应该时解决jit时过度优化,虽然两个核心cache line 不会及时同步,complete 值修改通过MSIE协议也很快的通知到其他核心。

出现死循环在于jit 任魏complete值一直是false,并没有执行load操作,而是直接判断true跳转。

        bool complete = false;var t = new Thread(() =>{bool toggle = false;while (!complete){Thread.MemoryBarrier();toggle = !toggle;}});t.Start();Thread.Sleep(1000);complete = true;t.Join();

在看一个例子:(来自《window 并发编程指南》内存模型部分)
MyObject mo= ..;
int f= mo.field;
if(f==0)
{
  //same operation
  Console.WriteLine(f);
}
如果mo.field 在读取和Console.WriteLine相隔足够远,那么编译器可能会认为读mo.field 读取两遍会更有效,被编译成如下代码:
MyObject mo= ..;
if(mo.filed==0)
{
  //same operation
  Console.WriteLine(mo.field);
}
编译器可能判断,保留这个值是否给寄存器带来压力并导致栈空间的低效使用,并且之个分支是否很少被使用(因此f值就不需要多次)
这样带来多线程问题,将f值使用volatitle修饰,可禁止这种优化

我看:多线程才会出现吧!!

MemoryBarrier相关推荐

  1. 【转】细说.NET中的多线程 (六 使用MemoryBarrier,Volatile进行同步)

    上一节介绍了使用信号量进行同步,本节主要介绍一些非阻塞同步的方法.本节主要介绍MemoryBarrier,volatile,Interlocked. MemoryBarriers 本文简单的介绍一下这 ...

  2. Lock,LockFree,MemoryBarrier,ConcurrentCollection

    最近看并行编程书本的一些心得,简单记录下多线程和并行编程必知必会的几个概念,再次加深自己的理解. .NET Framework4提供了一个新的命名空间System.Collections.Concur ...

  3. Java线上问题排障:Linux内核bug引发JVM死锁导致线程假死

    Java本质上还是离不开操作系统,一来Java源码是用C/C++实现的,二来java进程还是需要依附于操作系统和硬件资源,有时候一些问题是操作系统级别导致的,下面的整个事件是源自一则真实的线上案例. ...

  4. 并发编程专题——第一章(深入理解java内存模型)

    说到并发编程,其实有时候觉得,开发中真遇到这些所谓的并发编程,场景多吗,这应该是很多互联网的在职人员,一直在考虑的事情,也一直很想问,但是又不敢问,想学习的同时,网上这些讲的又是乱七八糟,那么本章开始 ...

  5. 对volatile的理解

    JMM 是什么 JMM(java内存模型 Java Memory Model)本身是一种抽象的概念,描述一组规则后规范通过这组规范定义了程序中各个变量(包括实例字段,静态变量和组成数组对象的元素)的访 ...

  6. Cygwin编译cef

    1.下载cygwin,并安装如下项: autobuild autoconf autogen automake ccrypt cmakegcc-g++gdb httpd libGLw-devel lib ...

  7. Singleton、MultiThread、Lib——实现单实例无锁多线程安全API

        前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为s ...

  8. 《为什么在多核处理器下需要内存屏障(MenmoryBarrier)?》

    <为什么在多核处理器下需要内存屏障(MenmoryBarrier)?> 因为CPU的乱序执行技术虽然可以极大的提高流水线的工作效率,但是导致了实际运行次序和program的次序不一致,如果 ...

  9. 有关“双重检查锁定失效”的说明

    双重检查锁定(以下称为DCL)已被广泛当做多线程环境下延迟初始化的一种高效手段. 遗憾的是,在Java中,如果没有额外的同步,它并不可靠.在其它语言中,如c++,实现DCL,需要依赖于处理器的内存模型 ...

  10. CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs

    Class Libraries and Thread Safety 线程同步是用来避免多个线程同时访问共享数据时出现冲突: 线程同步的障碍: 1.极其乏味易错: 2.锁严重影响性能: 3.线程同步锁在 ...

最新文章

  1. 070103_条件概率与贝叶斯公式,独立性
  2. CCRD_TOC_2015_EULAR专刊第二辑
  3. 了解spring大家族
  4. Building System之 get_abs_build_var() get_build_var()
  5. ubuntu系统无法ssh登录--安装openssh
  6. linux之nm命令
  7. 为什么那么好的女孩子还单身?
  8. Delphi面向对象学习随笔一:类与对象的关系
  9. 求助pycharm里import pandas遇到No module named pandas怎么办
  10. autowired 静态方法使用_静态方法中调用Spring注入过程解析
  11. 文件解压缩,删除文件,创建文件,读取xml文件为json字符串,得到相对路径下的图片名称...
  12. exception内置对象
  13. JavaScript复制内容到剪贴板 1
  14. Xilinx zynq zynqMP SD EMMC
  15. python爬取招聘网站的选题背景_Python爬虫爬取智联招聘(进阶版)
  16. 以太坊parity2.72节点客户端部署安装
  17. 一加nfc门禁卡录入_一加手机NFC门禁卡模拟加密卡教程(需root)
  18. win10计算机维护,Win10系统打开或关闭自动维护功能的方法
  19. Intel前CEO欧德宁的“功“与”过”
  20. 五种永久免费 内网穿透傻瓜式使用

热门文章

  1. 计算机鼠标知识,计算机基础知识:鼠标的使用
  2. JS实现新年倒计时动画特效+音乐案例
  3. 语音信号处理1 ----- 基础知识
  4. c语言搜索算法伪代码,FFT算法伪代码
  5. 各种cms getshell技巧
  6. 可重用性,可维护性,可读性,可测试性,可用性,健壮性
  7. 时域采样与频域采样实验【matlab】
  8. 机械工程c语言第一学期考试题,科学出版社机械工程图学习题集1~10章答案.ppt
  9. 渲染巨匠(lightscape) 3.2 SP1 汉化版
  10. 建站之星网站 和服务器,建站之星网站 和服务器