内存屏障生成器

2023-12-23

Reading Joseph Albahari 的线程教程 http://www.albahari.com/threading/part4.aspx,以下被提及为内存屏障的生成器:

  • C#'s lock陈述 (Monitor.Enter/Monitor.Exit)
  • 上的所有方法Interlocked class
  • 使用线程池的异步回调 - 其中包括异步委托、APM 回调和任务延续
  • 设置并等待信令构造
  • 任何依赖于信号的事情,例如启动或等待任务

此外,汉斯·帕桑特和布莱恩·吉迪恩添加了以下内容 https://stackoverflow.com/questions/6574389/thread-safe-usage-of-lock-helpers-concerning-memory-barriers(假设没有一个已经属于前面的类别之一):

  • 启动或唤醒线程
  • 上下文切换
  • Thread.Sleep()

我想知道这个列表是否完整(是否可以实际制作一个完整的列表)

EDIT建议补充:

  • 易失性(读取意味着获取栅栏,写入意味着释放栅栏)

这是我对这个主题的看法,并试图在一个答案中提供一个准完整的列表。如果我遇到其他人,我会不时编辑我的答案。

人们普遍认为会造成隐性障碍的机制:

  • All Monitor包含 C# 关键字的类方法lock
  • All Interlocked类方法。
  • All Volatile类方法(.NET 4.5+)。
  • Most SpinLock方法包括Enter and Exit.
  • Thread.Join
  • Thread.VolatileRead and Thread.VolatileWrite
  • Thread.MemoryBarrier
  • The volatile关键词。
  • 任何启动线程或导致委托在另一个线程上执行的操作,包括QueueUserWorkItem, Task.Factory.StartNew, Thread.Start,编译器提供BeginInvoke方法等
  • 使用信号机制,例如ManualResetEvent, AutoResetEvent, CountdownEvent, Semaphore, Barrier, etc.
  • 使用编组操作,例如Control.Invoke, Dispatcher.Invoke, SynchronizationContext.Post, etc.

推测(但不确定)导致隐性障碍的机制:

  • Thread.Sleep(由我自己和可能其他人提出,因为可以使用此方法修复表现出内存屏障问题的代码)
  • Thread.Yield
  • Thread.SpinWait
  • Lazy<T>取决于哪个LazyThreadSafetyMode已指定

其他值得注意的提及:

  • C# 中事件的默认添加和删除处理程序,因为它们使用lock or Interlocked.CompareExchange.
  • x86 存储具有释放栅栏语义
  • 尽管 ECMA 规范并未强制执行,但 Microsoft 的 CLI 实现已释放写入栅栏语义。
  • MarshalByRefObject seems to suppress certain optimizations in subclasses which may make it appear as if an implicit memory barrier were present. Thanks to Hans Passant https://stackoverflow.com/a/10308000/158779 for discovering this and bringing it to my attention.1

1This explains why BackgroundWorker works correctly without having volatile on the underlying field for the CancellationPending property.

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

内存屏障生成器 的相关文章

随机推荐

  • 在 Github 中找不到 api 令牌

    我刚刚安装了 GitExtension 一切都已配置完毕 当我单击 克隆 Github 存储库 时 它会打开一个标题为 Github 配置 的对话框 其中包含以下输入框 1 用户 2 密码 3 API令牌 当我点击 获取 Api 令牌 按钮
  • Subversion 分支/主干最佳实践 - 保持分支最新?

    我的开发团队已经使用 Subversion 工作了一段时间了 主干和分支的管理方式如下 我们 几乎 总是从后备箱释放 每个版本都有自己的分支 当一个版本准备好进行 QA 时 我们将分支合并回主干 并为下一个版本创建一个新分支 开发人员可以在
  • 尝试使用 libtomcrypt 库(rsa 公钥生成)时出现 Contiki mote 类型创建错误

    我正在尝试使用 libtomcrypt 库为我的学校项目进行 RSA 公钥生成 但我无法使用 Contiki OS 在 Cooja 中加载该库 我尝试将我需要的文件编译成目标文件并将其加载到 csc file 这是我收到的错误消息 se s
  • 如何使用自定义视图android保存绘图?

    我正在使用以下代码 我在保存图像时遇到问题 我能够保存位图 但是当保存 bimap 时 它也保存了我也用黑色擦除了油漆 public class FingerPaint extends GraphicsActivity implements
  • 尝试从 R 中的数据框创建条形图[重复]

    这个问题在这里已经有答案了 我想更好地可视化我使用 barplot 函数在 R 中创建的一组数据 但是 我不确定如何根据数据框中的两列来执行此过程 我的数据框的名称 myData 以下是我的数据框的内容 States Churn 1 AK
  • Pyspark Dataframe 将函数应用于两列

    假设我有两个 PySpark DataFramedf1 and df2 df1 a 1 2 5 df2 b 3 6 我想找到最接近的df2 b 每个的价值df1 a 并将最接近的值添加为新列df1 换句话说 对于每个值x in df1 a
  • 我什么时候需要管理托管资源?

    我一直在研究标准的 Dispose 模式 我只是想知道我需要编写什么来释放托管资源 如果这些资源已经被 管理 那么我肯定不需要做任何事情 如果是这种情况 并且我的类不包含任何非托管资源 因此不需要通过 GC 来完成它 那么我是否只需要在 D
  • iOS 钥匙串:更新 kSecAttrAccessible 时 SecItemUpdate 返回 -50 (paramErr)

    我需要更新钥匙串条目的 kSecAttrAccessible 我不需要更新实际数据 只需更新可访问性属性 首先 我尝试找到该项目以确保我的查询字典是好的 sanityCheck SecItemCopyMatching bridge CFDi
  • 如何使用CSS在悬停时缩放图像

    如何使用 CSS 缩放悬停时 div 内的图像 仅缩放图像 而不缩放 div 看看我在说什么here https youtu be 5WRX1gz K Q 对 tim klein 答案进行一些细微修改以获得视频效果 container bo
  • 嵌入的 YouTube 视频不会重播

    奇怪的是 嵌入的 YouTube 视频一旦播放 通过单击 播放 或在页面加载时自动播放 将不会再次播放 我使用直接从 YouTube 复制的标准 iFrame 嵌入 几个不同的短视频以及我测试过的所有浏览器 操作系统组合 Windows M
  • 如何使用 TOP * select 返回记录总数

    我有超过 300 000 行 即使我使用 TOP 语句仅选择 20 50 100 条记录 我也想返回记录总数 是否可以过滤选择 select top 50 from table where rule1 rule1 and rule rule
  • 使用slidenavigatoin动态地将xtype项目添加到面板

    所以我试图将项目动态地放置到具有slidenavigation特征 FlyoutNavigation js Ext define APN view FlyoutNavigation id flyoutNavigationPanel exte
  • 检查当前活动窗口是否为桌面

    我尝试检查当前活动窗口是否是桌面执行某些操作 我在计时器中编写了以下代码 但 GetDesktopWindow 和 GetForegroundWindow 返回的句柄值不是相同的值 if GetForegroundWindow GetDes
  • 图放置四开降价(浮动说明符)

    在 LaTeX 中 可以使用浮点说明符来控制图形位置 例如 H 将浮点精确地放置在代码中的位置 begin figure H caption Caption label label includegraphics width textwid
  • 计算两个日期之间的天数 - J2ME

    我想计算两个日期之间的天数 我在网上找到了一些解决方案 但问题出在我的 NetBeans 中公历不可用 所以无法计算天数 有人可以帮忙吗 在 Java Micro Edition 中 您没有 GregorianCalendar 因此您必须使
  • 具有重复字符的正则表达式

    我需要编写一个正则表达式 它可以检测仅包含字符 x y 和 z 的字符串 但其中的字符与其相邻字符不同 这是一个例子 xyzxzyz 通过 xyxyxyx 通过 xxyzxz 失败 重复 x zzzxxzz 失败 相邻字符重复 我认为这会起
  • React-native 0.40+ 获取自签名证书

    我找到了这个答案https stackoverflow com a 41703745 1646117 https stackoverflow com a 41703745 1646117但我无法让它与 React native 0 40 一
  • myDate.toLocaleString() 对于英语以外的任何其他语言都没有正确格式化

    我当前正在将日期发送到电子邮件模板 我需要根据收件人的语言设置这些日期的格式 我正在使用 toLocaleString 函数 它对英语很有魅力 但对我尝试过的其他语言则不然 我尝试使用 moment 或 luxon 来格式化日期 但我想我的
  • Nginx、Rails 和 Oauth。上游过早关闭连接

    我有一个奇怪的问题 只有当我使用 nginx 和 unicorn 时才会在生产环境中出现 当我在没有 nginx 的情况下使用 unicorn 时 这种情况不会发生 问题 我有一个简单的 oauth 身份验证 允许用户通过 GitHub 注
  • 内存屏障生成器

    Reading Joseph Albahari 的线程教程 http www albahari com threading part4 aspx 以下被提及为内存屏障的生成器 C s lock陈述 Monitor Enter Monitor