c# 非阻塞算法_c# – 了解非阻塞线程同步和Thread.MemoryBarrier

c# 非阻塞算法_c# – 了解非阻塞线程同步和Thread.MemoryBarrier这是Thread.MemoryBarrier()的一个例子classFoo{int_answer;bool_complete;voidA(){_answer=123;Thread.MemoryBarrier();//Barrier1_complete=true;Thread.MemoryBarrier();//Barrier2}voidB(){Thread…

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

这是Thread.MemoryBarrier()的一个例子

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);

}

}

}

我们讨论了是否有线程阻塞正在进行?

我认为有一些,特别是考虑到了

A full fence takes around ten nanoseconds on a 2010-era desktop.

另一方面,完全围栏只应该禁用指令重新排序和缓存,它的声音不符合线程阻塞的条件,(与锁定不同的是,它清除该线程等待其他人在继续之前释放锁定,并在此期间被阻止)时间)

关于那个线程’阻止状态’.我说的不是线程是否被置于阻塞状态,而是是否有一些线程同步发生,这意味着一个线程无法运行,而其他线程不允许它这样做,通过MemoryBarrier in这个案例.

我也希望清楚地了解每个障碍实现的目标.例如Barrier 2 – 它如何提供新鲜度保证以及它如何连接到屏障3?如果有人会在这里详细解释每个障碍的目的(如果不存在1或2或3或4那么可能会出错)我认为id会大大提高我对此的理解.

编辑:它现在大部分都清楚了1,2和3.然而,3不具备的4还不清楚.

解决方法:

指令花费时间执行的事实并不意味着线程被阻止.当一个线程被特定地置于阻塞状态时被阻塞,而MemoryBarrier()不会这样做.

实际上阻​​止指令重新排序和缓存刷新的处理器指令需要时间,因为它们必须等待缓存再次变得连贯.在此期间,线程仍被视为正在运行.

更新:让我们看看示例中实际发生了什么,以及每个内存屏障实际上做了什么.

正如链接所说,1和4确保产生正确的答案.这是因为1确保将答案刷新到内存中,并且4确保在检索变量之前刷新读取缓存.

2和3确保如果A先运行,那么B将始终打印答案. Barrier 2确保将true的写入刷新到内存,而barrier 3确保在测试_complete的值之前刷新读取cahces.

缓存和内存刷新应该足够清晰,所以让我们看看指令重新排序.编译器,CLR和CPU知道它们可以重新排序指令的方式是按顺序分析一组指令.当他们在序列中间看到屏障指令时,他们知道指令不能跨越该边界.这确保除了缓存新鲜度之外,指令以正确的顺序发生.

标签:c,net,multithreading

来源: https://codeday.me/bug/20190521/1147704.html

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

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

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


相关推荐

  • 程序员看过都说好的资源网站,你懂得![通俗易懂]

    程序员看过都说好的资源网站,你懂得![通俗易懂]身为一个程序员,有时候为了程序的界面好看,不得不去查找一些好看的图标或者图片等来装饰网站,那么问题来了,去哪里找?不用慌,程序羊为大家整理了一些常用的网站,希望能对您有帮助!后续还会不断更新。喜欢记得关注程序羊喔,不然下次您就找不到程序羊了。

    2022年6月10日
    80
  • 为joomla加入�下拉菜单的方法

    为joomla加入�下拉菜单的方法

    2021年12月6日
    36
  • 3极管的原理_二极管讲解

    3极管的原理_二极管讲解我们把晶体管比作两个二极管时候,是指基极-射极二极管和基极-集电极二极管。NPN型二极管与PNP型二极管对三极管放大作用的理解,切记一点:能量不会无缘无故的产生,所以,三极管一定不会产生能量。但三极管厉害的地方在于:它可以通过小电流控制大电流。放大的原理就在于:通过小的交流输入,控制大的静态直流。假设三极管是个大坝,这个大坝奇怪的地方是,有两个阀门,一个大阀门,一个小阀门。小阀门可以用…

    2022年10月21日
    1
  • windows7/windows10 虚拟显示器部署(Virtual monitor)

    最近有些网友看了我之前的博客之后,向我要虚拟显示器的bin文件,由于之前代码是绑定在VDI下的,没有单独的虚拟显示器代码,所以抽空提取了下相关代码,单独编译。网盘:https://pan.baidu.com/s/1vdqm0Is9pjAcG40Qf_q7cw有问题加QQ3505459047咨询。总结了下网友的一些用途,这几种情况下使用虚拟显示器(显卡欺骗器功能的软件)可以解决:…

    2022年4月5日
    1.2K
  • Idea生成Javadoc

    Idea生成Javadoc

    2022年3月12日
    35
  • Object-c @property的用法

    Object-c @property的用法

    2021年12月7日
    40

发表回复

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

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