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年7月12日 下午9:16
下一篇 2022年7月12日 下午9:16


相关推荐

  • 券商分析师集体分享养“龙虾”教程, 现象级AI智能体OpenClaw如何卷动投研圈?

    券商分析师集体分享养“龙虾”教程, 现象级AI智能体OpenClaw如何卷动投研圈?

    2026年3月13日
    5
  • 最新Latex安装详细教程

    最新Latex安装详细教程看到有的博客推荐CTeX,但CTeX已经没有维护了,所以这里还是推荐官方的TeXLive官网:TeXLive官网1、下载TeXLive这里我直接去国内的镜像站点下载了中科大镜像

    2022年4月29日
    73
  • Nginx正向代理配置详解

    Nginx正向代理配置详解一 nginx 正向代理介绍及配置 需要在客户端配置代理服务器进行指定网站访问 模块 ngx http proxy module http nginx org en docs http ngx http proxy module html proxy set header1 环境介绍代理服务器系统环境为 centosnginx 代理服务器为 192 168 10 10 测试客户端为局域网内任意 windows 电脑或 Linux 电脑 2 正向代理简介通过代理服务器来访问

    2026年3月26日
    2
  • Haar特征与积分图

    Haar特征与积分图Haar 特征与积分图 1 Adaboost 方法的引入 1 1Boosting 方法的提出和发展 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 在了解 Adaboost 方法之前 先了解一下 Boosting 方法 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 回答一个是与否的问题 随机猜测可以获得 50 的正确率 如果一种方法能获得比随机猜测稍微高一点的正确率 则就可以称该得到这个方法的过程为弱学习 如果一个方法可以显著提高猜测的正确率

    2026年3月17日
    2
  • siamfc代码解读_每日一文:目标跟踪(SiamFC)「建议收藏」

    siamfc代码解读_每日一文:目标跟踪(SiamFC)「建议收藏」Fully-ConvolutionalSiameseNetworksforObjectTracking.arXiv:1606.09549v2主体结构:核心CNN是AlexNet,去掉padding和全连接层FC,加入BN层,改为全卷积网络FCN,控制stride为8。FCN部分作用相当于特征提取,会得到与输入图像分辨率相关,通道数128的featuremap,类似与常用fHOG特征(h…

    2026年4月16日
    9
  • tensorflow pycharm教程_tensorflow支持python3.8吗

    tensorflow pycharm教程_tensorflow支持python3.8吗pycharm使用tensorflow流程最近在学人工智能与大数据管理,环境是python+tensorflow。但配置有些麻烦,记录一下。其实主要分为两个部分,配置tnsorflow和在pycharm中使用tensorflow。首次尝试平常安装python包都是去pycharm的setting里面,在设置ProjectInterpreter中点小加号去装的,但这次却报了错。想来应该是有些…

    2022年8月25日
    6

发表回复

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

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