EventWaitHandle 是否有任何隐式 MemoryBarrier?

2024-02-07

我是这个网站的新手,所以如果我没有以可接受的方式发帖,请告诉我。

我经常按照下面的示例编写一些代码(为了清楚起见,省略了诸如 Dispose 之类的内容。)。我的问题是,是否需要如图所示的挥发物?或者 ManualResetEvent.Set 是否像我读过的 Thread.Start 那样具有隐式内存屏障?或者显式的 MemoryBarrier 调用会比易失性更好吗?还是完全错误的?另外,据我所知,某些操作中的“隐式内存屏障行为”没有记录下来,这一事实非常令人沮丧,是否有这些操作的列表?

谢谢, 汤姆

:

class OneUseBackgroundOp
{

   // background args
   private string _x;
   private object _y;
   private long _z;

   // background results
   private volatile DateTime _a
   private volatile double _b;
   private volatile object _c;

   // thread control
   private Thread _task;
   private ManualResetEvent _completedSignal;
   private volatile bool _completed;

   public bool DoSomething(string x, object y, long z, int initialWaitMs)
   {
      bool doneWithinWait;

      _x = x;
      _y = y;
      _z = z;

      _completedSignal = new ManualResetEvent(false);

      _task = new Thread(new ThreadStart(Task));
      _task.IsBackground = true;
      _task.Start()

      doneWithinWait = _completedSignal.WaitOne(initialWaitMs);

      return doneWithinWait;

   }

   public bool Completed
   {
      get
      {
         return _completed;
      }
   }

   /* public getters for the result fields go here, with an exception
      thrown if _completed is not true; */

   private void Task()
   {
      // args x, y, and z are written once, before the Thread.Start
      //    implicit memory barrier so they may be accessed freely.

      // possibly long-running work goes here

      // with the work completed, assign the result fields _a, _b, _c here

      _completed = true;
      _completedSignal.Set();

   }

}

请注意,这是即兴的,没有仔细研究您的代码。我不thinkSet 执行内存屏障,但我不明白这与您的代码有何相关?似乎更重要的是 Wait 是否执行一个操作,它确实执行了。因此,除非我在花 10 秒查看您的代码时错过了某些内容,否则我不认为您需要 挥发物。

编辑:评论过于严格。我现在指的是马特的编辑。

马特的评估做得很好,但他遗漏了一个细节。首先,让我们提供一些乱七八糟的东西的定义,但这里没有澄清。

易失性读取读取一个值,然后使 CPU 缓存无效。易失性写入会刷新缓存,然后写入值。内存屏障会刷新缓存,然后使其无效。

.NET 内存模型确保所有写入都是易失性的。默认情况下,不会进行读取,除非进行了显式 VolatileRead,或者在字段上指定了 volatile 关键字。此外,互锁方法强制缓存一致性,并且所有同步概念(Monitor、ReaderWriterLock、Mutex、Semaphore、AutoResetEvent、ManualResetEvent 等)在内部调用互锁方法,从而确保缓存一致性。

同样,所有这些都来自 Jeffrey Richter 的书“CLR via C#”。

我一开始就说过我没有think设置执行了内存屏障。然而,进一步思考 Richter 先生所说的,Set 将执行互锁操作,因此也将确保缓存一致性。

我坚持我最初的主张,即这里不需要 volatile。

编辑2:看起来你正在构建一个“未来”。我建议你看看,而不是自己滚动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EventWaitHandle 是否有任何隐式 MemoryBarrier? 的相关文章

随机推荐

  • Python subprocess.Popen.wait() 即使发生错误也返回 0

    我正在通过 Python 的子进程模块运行命令行实用程序 我使用命令行参数和 stdout subprocess PIPE 创建一个 subprocess Popen 对象 然后使用 subprocess wait 等待任务完成并返回返回代
  • 在 Google 图表中显示/隐藏线条/数据

    我正在尝试制作一个包含 2 条线的谷歌折线图 您应该能够通过两个复选框打开和关闭它们 显示 隐藏 有人有任何想法可以做到这一点 或者只是给出一些指示吗 我的猜测是一些 onClick jQuery 的东西
  • TS2307:找不到模块“类验证器”

    我正在尝试使用类验证器 https github com pleerock class validatorTypescript 项目中的模块 但是 当我编译打字稿时 会发出以下警告 src main ts domain Order ts 1
  • 获取并在 Woocommerce 单一产品页面上显示税率

    我正在尝试找到一种方法 如何仅显示产品所具有的税率 16 或 7 基本上 这个想法是应该有一个静态税 价格包含16 税费 or 价格含7 税 因此 百分比利率应该根据产品的利率而动态变化 知道如何解决这个问题 我找到的所有解决方案都显示完整
  • RabbitMQ 中的消息序列出现意外行为

    我想实现类似于选项 3 的 RabbitMQ 拓扑here https engineering nanit com rabbitmq retries the full story ca4cc6c5b493 除了一些差异 新拓扑每天应该处理几
  • 为什么我要使用无限超时的 Sleep() ?

    据 MSDN 报道 Sleep http msdn microsoft com en us library ms686298 VS 85 aspx可以提供INFINITE值并且 表明暂停不应超时 为什么我要调用 Sleep INFINITE
  • 是否有工具可以找出 PC 上安装了哪个 .NET 框架?

    我知道官方的方法是注册表 但这有点耗时 我必须检查几台电脑上安装的版本 它们都没有 VisualStudio 但它们全部 可能 a NET 框架的版本 既然热水可能已经存在 那么我在哪里可以找到它呢 这是一个免费的轻量级工具 可以快速完成此
  • 我们的记录中不存在 AWS 访问密钥 ID

    我创建了一个新的访问密钥并在 AWS CLI 中配置了该密钥aws configure 它创造了 ini文件输入 aws config 当我跑步时aws s3 ls它给 调用 ListBuckets 操作时发生客户端错误 InvalidAc
  • PHP 网址问题

    有没有办法可以使用 PHP 从链接中删除变量 例如 如果我有一个读取的链接http localhost link index php s 30 p 3我该如何去掉 s 30 p 3所以我的链接是这样的http localhost link
  • 如何将 URL 中的图像附加到 FormData - Javascript

    这是我的小 JavaScript 代码
  • Caffe:如何通过代码获取`solver.prototxt`参数?

    我想访问solver prototxt参数如base lr 基础学习率 或weight decay来自Python代码 有什么方法可以从solver net目的 谢谢 根据本教程 http nbviewer jupyter org gith
  • iOS 15 safari 工具栏现在在元素内滚动时隐藏

    在 iOS 15 上 无论您有顶部还是底部工具栏 在元素内滚动都会导致窗口调整大小 工具栏消失 在 iOS 14 上 只有当主体滚动时才会发生这种情况 请参阅下面的 gif 注意 黄色区域是一个带有溢出滚动的 div 并且主体不滚动 iOS
  • 使用 JavaScript 截断文本并附加省略号

    如何截断字符串并附加省略号 我想截断类似的东西 this is a very long string to this is a ve function truncate input if input length gt 5 return i
  • 检查 Activity 是否正在从 Service 运行

    怎样才能一个Service检查其应用程序之一是否Activity正在前台运行 使用以下方法和您的包名称 如果您的任何活动位于前台 它将返回 true public boolean isForeground String myPackage
  • urlopen() gbk 页面时 Python 中的编码问题

    我的代码在这里 coding utf 8 if name main from urllib2 import urlopen url http iccna blog sohu com 164572951 html data urlopen u
  • java中pdf解析为文本

    我有一个阿拉伯语 PDF 我想使用 Java 将其解析为文本文档 我已经尝试了很多次 英语单词解析成功 但阿拉伯语单词解析失败 谁能推荐一个可以正确转换阿拉伯语单词的解决方案 我想到了几个图书馆 阿帕奇蒂卡 http tika apache
  • onChange 是一个延迟字符 - Hooks

    我是 React 和 Hooks 的新手 我创建了一个简单的搜索栏 用户可以在其中输入一些文本 然而 如果我console log之后的状态onChange 它总是落后一个字符 例如 如果我输入 披萨 console log鞋子 披萨 我的
  • 循环依赖——什么时候终止?

    我无法理解 python 是如何管理的imports 假设我有以下应用程序结构 application application py model init py user py 假设application py文件在创建数据库后导入模型模块
  • 使用 jQuery 将参数发送到 Java Server Pages (JSP)

    我想向 JSP 发送不同的参数 是否可以在 jQuery 中向 JSP 发送多个参数 因为jQuery是客户端 JSP是服务器端 告诉我 您可以通过ajax请求传递参数 例如 ajax type POST url userNameCheck
  • EventWaitHandle 是否有任何隐式 MemoryBarrier?

    我是这个网站的新手 所以如果我没有以可接受的方式发帖 请告诉我 我经常按照下面的示例编写一些代码 为了清楚起见 省略了诸如 Dispose 之类的内容 我的问题是 是否需要如图所示的挥发物 或者 ManualResetEvent Set 是