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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 约束条件(constraint)「建议收藏」

    约束条件(constraint)「建议收藏」1.为啥使用约束条件:约束条件也叫完整性约束条件,当对表中的数据做DML操作时会验证数据是否违反约束条件.如果违反了DML操作会失败.约束条件可以应用于表中的一列或几列,应用于整个表或几个表之间.约束条件分类:非空(NOTNULL),唯一(UNIQUE),主键(PRIMARYKEY),外键(FOREIGNKEY),检查(CHECK).其中NOTNULL只能应用于列.

    2022年10月13日
  • vue 重新加载页面_页面重新加载

    vue 重新加载页面_页面重新加载Vue刷新页面重新加载问题描述在加载同一路由页面的时候,vue的页面默认是不刷新的,需要重新加载数据解决方案修改App.vue在路由视图上添加一个变量isRouterAlive判断显示实现重新加载<template><!–<router-view/>–><router-viewv-if=”isRouterAlive”/></template><script>/*这个脚本主要是用来刷新页面的

    2022年10月17日
  • JBOSS 下载_JbusDriver

    JBOSS 下载_JbusDriver1:JBossApplicationServerDownloadshttp://jbossas.jboss.org/downloads/只下载JBossAS7.1.1.Final ASCertifiedJavaEE6FullProfile 2012-03-09 LGPL [b]Communityparticipationonly[/b]

  • httprunner(9)运行测试用例的方式总结「建议收藏」

    httprunner(9)运行测试用例的方式总结「建议收藏」前言用过pytest的小伙伴都知道,pytest的运行方式是非常丰富的,可以说是你想怎么运行怎么运行,想运行哪些运行哪些,那httprunner是否同样可以呢?运行用例的各种方式运行指定路径的用

  • Java 内部静态类_静态内部类特点

    Java 内部静态类_静态内部类特点Java中的内部类是在Jdk1.1版本之后增加的,内部类是Java语言中一个比较重要的概念,如果能把内部类运用好,那么会明显增强Java程序的灵活性。要想清楚static内部类和非static内部类的区别,首先要了解内部类的概念及特点,然后再进行一个全面的对比。什么是内部类呢?简单的说就是在一个类的内部又定义了一个类,这个类就称之为内部类(InnerClass)。看一个简单的例子:内…

    2022年10月11日
  • arping详解

    arping详解最近检测内网机器的ip占用问题,用到了arping,总结一下。版本arping主要干的活就是查看ip的MAC地址及IP占用的问题。arping有两个版本,一个版本是ThomasHabets这个人写的,这个版本有个好处是可以arping<MAC地址>,也就是说我们可以通过MAC地址得到IP。还有一个版本是Linuxiputilssui…

发表回复

您的电子邮箱地址不会被公开。

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