Thread.MemoryBarrier 方法

Thread.MemoryBarrier 方法classFoo{int_answer;bool_complete;voidA(){_answer=123;_complete=true;}voidB(){if(_complete)Console.Wri…

大家好,又见面了,我是你们的朋友全栈君。

class Foo
{
    int _answer;
    bool _complete;
    void A()
    {
        _answer = 123;
        _complete = true;
    }
 
    void B()
    {
        if (_complete) Console.WriteLine(_answer);
    }
}
 
如果A和B是运行在2个并行的线程上,B有可能打印出0。
出于2中原因:
 
1,编译器,CLR或者CPU可能重新排序了程序指令,以此提高效率。
2,编译器,CLR或者CPU引入缓存优化导致其他的线程不能马上看到变量值的更改。
 
使用Memory barrier可以防止重新排序程序指令或者缓存。调用Thread.MemoryBarrier就是实现一个Memory barrier。
 
class Foo
{
    int _answer;
    bool _complete;
    void A()
    {
        _answer = 123;
        Thread.MemoryBarrier(); // Barrier 1
        _complete = true;
        Thread.MemoryBarrier(); // Barrier 2
    }
    void B()
    {
        Thread.MemoryBarrier(); // Barrier 3
        if (_complete)
        {
            Thread.MemoryBarrier(); // Barrier 4
            Console.WriteLine(_answer);
        }
    }
}
 
Thread.MemoryBarrier()按如下方式同步内存访问:执行当前线程的处理器在对指令重新排序时,不能采用先执行 MemoryBarrier 调用之后的内存访问,再执行 MemoryBarrier 调用之前的内存访问的方式。
调用一次MemoryBarrier大约花费10纳秒.



















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/526398
,如需转载请自行联系原作者



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157914.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unity 3D游戏开发学习教程

    Unity 3D游戏开发学习教程用C#用Unity3D制作游戏你会学到:您将学习3D游戏开发基础知识,以使用Unity3D引擎推进事物。到本课程结束时,他们将可以轻松制作任何类型的游戏,无论是3D还是2DMP4|视频:h264,1280×720|音频:AAC,44.1KHz,2Ch语言:英语+中英文字幕(根据原英文字幕机译更准确)|时长:87节课(11h32m)|大小解压后:5.86GB描述用Unity3D开发3D游戏《2021年》是一门结构完善的高级UnityC#课程,专为完全…

    2022年9月15日
  • 来看看视频种子骗局[通俗易懂]

    来看看视频种子骗局1,都是很难下载的资源2,以1080BulRay命名3,文件大小集中在1G左右4,以xmous结尾(应该是作者为了好识别)5,都有官方宣传图片(Cover.jpg)和说明txt文件

    2022年4月17日
  • 同事半个月都没搞懂selenium,我半个小时就给他整明白!顺手秀了一波爬淘宝的操作[通俗易懂]

    同事半个月都没搞懂selenium,我半个小时就给他整明白!顺手秀了一波爬淘宝的操作[通俗易懂]教你用selenium爬虫,爬取淘宝商品详情信息!

    2022年6月17日
  • JavaScript之正则表达式的使用方法详细介绍[通俗易懂]

    JavaScript之正则表达式的使用方法详细介绍[通俗易懂]首先必须说明的是,这类文章(js正则表达式)在c站或者整个it类论坛是很多人写过的,而我认为我这篇的不同之处在于更加“小白”化,这也与我一贯的风格有关吧。关于JavaScript正则表达式,其他的文章大多一上来就太过激进,不利于初学者学习(我当粗就是这么被劝退的),这也是我为什么要坚持写这篇文章,希望小白在看了这篇文章后,不管能不能完全掌握JavaScript正则表达式,但至少对JavaScript正则表达式能有一个比较深刻的印象吧。

    2022年10月24日
  • django的render函数_django render

    django的render函数_django renderreverse函数reverse函数的作用是用来进行URL反转的,接下来我们介绍reverse函数的几种用法之前我们都是通过url来访问视图函数。有时候我们知道这个视图函数,但是想反转回他的url

    2022年7月31日
  • javascript格式化输出的实现(MuJS)

    javascript格式化输出的实现(MuJS)MuJS是一款支持嵌入式开发的轻量级javascript解释器。javascript主要是针对web开发的脚本语言,所以主要借助浏览器来调试;但mujs针对的是嵌入式开发,调试时的交互主要靠输入输出终端,javascript本身是不支持的,所以需要调用c语言的打印函数来实现。下面给出两个例子,一个是普通输出,符合脚本语言的解释性语言的特点,不考虑变量的类型;另一个是简单的格式化输出。前一个…

    2022年10月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号