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年8月2日
  • 【开发工具】【smartctl】硬盘检测工具(smartctl)的使用

    【开发工具】【smartctl】硬盘检测工具(smartctl)的使用概述随着硬盘容量、速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非常巨大。不同的文件系统(xfs,reiserfs,ext3)都有自己的检测和修复工具。检测之前可以先使用dmesg命令查看有没有硬件I/O故障的日志,如果有,先用fsck看看是不是文件系统有问题,如果不是则可以使用下面介绍硬盘检测和优化方法来修复它。grep“error”/va/log/messages*;SMART是一种磁盘自我分析检测技术,早在90年代末就基本得到了

    2022年10月8日
  • 矩阵范数与向量范数关系_矩阵范数的定义

    矩阵范数与向量范数关系_矩阵范数的定义范数是距离在向量和矩阵上的推广,在研究收敛性、判断矩阵非奇异等方面有广泛应用。本节包括以下内容:(1)向量范数;(2)矩阵范数;(3)从属范数;(4)谱半径;(5)矩阵的非奇异条件。1向量范数从向量到实数的映射/函数。定义(1)条件:非负性、齐次性、三角不等式(∥x+y∥≤∥x∥+∥y∥\|x+y\|\leq\|x\|+\|y\|)。

    2022年9月19日
  • Qt中的QFile读写文件操作「建议收藏」

    Qt中的QFile读写文件操作「建议收藏」1.首先记录一下QString,QByteArray,char*之间的转换(1)QString->QByteArrayQStringbuf="123";QByteArraya=buf.toUtf8();//中文a=buf.toLocal8Bit();//本地编码(2)QByteArray->char*char*b=a.data…

    2022年6月13日
  • todoMVC_mvc框架是什么

    todoMVC_mvc框架是什么依赖cssnpmitodomvc-commontodomvc-app-cssapp.component.tsimport{Component}from’@angular/core’;consttodos=[{id:1,title:’吃饭’,done:true},{id:1,title:’工作’,done:false},{id:1,title:’运动’,

    2022年9月11日
  • THINKPHP AJAX实例代码「建议收藏」

    THINKPHP AJAX实例代码「建议收藏」HTML文件: $(function(){ $(“#filename”).blur(function(){ varvalue=$(this).val(); $.ajax({ type:”GET”, url:”__URL__/ajax_check/name/”+value, dataType:”text”, success:fun

    2022年8月16日

发表回复

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

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