对 Volatile.Read/Write 的理解

2024-04-02

我试图理解 C# Volatile 类。

正如我读到的:

  • The Volatile.Write方法强制写入位置中的值 到呼叫点。此外,任何较早的程序订单 加载和存储必须在调用 Volatile.Write 之前发生。

  • The Volatile.Read方法强制读取位置中的值 在通话时。此外,任何以后的程序顺序加载 并且存储必须在调用 Volatile.Read 之后发生。

这是否意味着在以下情况下:

internal sealed class ThreadsSharingData {    
    private Int32 m_flag = 0;
    private Int32 m_value = 0;
    // This method is executed by one thread
    public void Thread1() {        
        // Note: 5 must be written to m_value before 1 is written to m_flag
        m_value = 5;
        Volatile.Write(ref m_flag, 1);        
    }

    // This method is executed by another thread
    public void Thread2() {        
        // Note: m_value must be read after m_flag is read
        if (Volatile.Read(ref m_flag) == 1)
        Console.WriteLine(m_value);        
    }    
}

cpu会先等待命令Volatile.Write(ref m_flag, 1);在开始写信之前m_flag?

这如何帮助线程同步?


cpu 会在 Volatile.Write(ref m_flag, 1); 之前等待命令。在开始写入 m_flag 之前?

呃,有点。更好的表达方式是:保证如果任何其他线程看到m_flag设置为 1,他们也会看到m_value设置为 5。

这如何帮助线程同步?

我不会说它有助于同步 - 但它确实有助于实现正确性。

如果您没有使用易失性读/写,编译器/运行时/CPU 可能会重新排序Thread1方法,程序将能够打印 0、5 或根本不打印任何内容。

对于易失性读/写,程序将打印 5 或根本不打印任何内容,但是never0. 这是预期的行为。

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

对 Volatile.Read/Write 的理解 的相关文章

  • 如何向 UWP 项目添加 .NET dll 引用?

    我有几个适用于 NETv4 x 的 NET dll 项目 我将版本更改为 4 6 1 并重新构建 没有出现问题 当我尝试从 UWP 项目向它们添加引用时 出现错误 项目的目标是 NETCore 而文件引用的目标是 NET框架 这不是受支持的
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 我应该在单元测试中使用 AutoMapper 吗?

    我正在为 ASP NET MVC 控制器方法编写单元测试 这些控制器依赖于IMapper 我创建的用于抽象 AutoMapper 的接口 使用 Castle Windsor 通过构造函数注入传入 动作方法使用IMapper从领域对象映射到
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 来自 iSeries 的带有附件的邮件

    有没有办法从 iSeries 终端发送电子邮件 并从 IFS 添加附件 我知道如何使用 SNDDST 实用程序发送普通电子邮件 有两种主要方法可以做到这一点 Do It Yourselfer 将使用 QtmmSendMail API Oth
  • 为什么 Annotate(blame) 的用户名与 IntelliJ IDEA 中提交的作者不同?

    当我在 IntelliJ IDEA 中使用 git annotate 时 某些行的作者用户名与此提交的作者姓名不同 如下图 如你看到的 fan qp and Qp不一样 为什么会这样呢 当我使用 bash 或 SourceTree 运行时g
  • 从服务器删除所有数据库

    我有一台服务器 SQL Server 2005 里面有300多个数据库 我不想逐个右键单击并选择Delete 如何轻松删除所有数据库 You can do this through the SSMS GUI Select the Datab
  • Google 会抓取 AJAX 内容吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在我网站的主页上 我使用 JQuery 的 ajax 函数来下拉用户最近活动的列表 最近的活动显示在页面上 并且最近活动的每一行都包含
  • 当想要批量返回x个元素组时MySQL选择查询

    如何通过单个查询批量返回选择结果 这应该是一个直接的复合选择 下面是一个示例表和一个简单的查询 它将通过当前使用在最终现实世界过程中无法工作的临时数字列来生成所需的结果 仅涉及两个关键列 ip addresses and oid addre
  • 按 List 的变量之一对 List 进行排序

    我有1级 public class Class1 public Class String s int s1 int soc this s s this s1 s1 this soc soc 我有一个List of Class1 List
  • PowerMock 抛出 NoSuchMethodError (setMockName)

    我正在尝试使用模拟构造函数PowerMockito但每次运行测试时都会出现以下错误 java lang NoSuchMethodError org mockito internal creation MockSettingsImpl set
  • 在 AJAX 请求之前使用 JavaScript 获取日期

    我有这个 AJAX 请求 function request str
  • 在 C# 中调用 Pocketsphinx AccesViolationException

    我正在尝试做口袋狮身人面像tutorial http cmusphinx sourceforge net wiki tutorialpocketsphinx在 C 中使用 pinvoke 但当我尝试使用 ps decode raw 进行解码
  • 如何更改所有列表项的属性值?

    我有一个简单的结构 例如 HTML ul li li ul 我想更改列表元素的每个 数据位置 属性 我的第一次Jquery镜头是在这里 costsDropdown ul each function li attr data position
  • C# 中的数字签名,无需使用 BouncyCastle

    不使用第 3 方 BouncyCastle 库 有没有办法读取自定义私钥并签署消息 sha256哈希 使用私钥加密 从技术上来说 是的 根据您拥有的密钥类型 答案会变得更加棘手 编辑 2019 年 10 月 NET Core 3 0 以 D
  • 验证 Base64 编码图像

    我正在构建一个应用程序 允许用户POSTHTML5 画布数据随后以 Base64 进行编码并显示给所有用户 我正在考虑将数据解析为实际的 png 文件并存储在服务器上 但 base64 路由允许我将图像存储在数据库中并最大限度地减少请求 图
  • SQL Server:根据条件查找日期与当前日期最接近的记录

    我正在使用 SQL Server 2012 并尝试创建一个将根据以下条件返回记录的视图 查询需要根据日期检索最适用的记录 对于内部日期范围内的日期 将返回最接近 CurrentDate 的记录 对于内部日期范围之外的日期 将返回最接近 Cu
  • 为什么在 shellcode 中使用 Push/Pop 而不是 Mov 将数字放入寄存器中?

    我有一些来自 shell 代码有效负载的示例代码 显示了 for 循环并使用 push pop 来设置计数器 push 9 pop ecx 为什么不能直接使用mov呢 mov ecx 9 是的 通常你应该总是使用mov ecx 9出于性能原
  • LinkedAuthorizationFailed 在 PowerShell 中意味着什么?

    我正在尝试使用 PowerShell 在 cosmos db 中添加虚拟网络规则 VNETS 存在于不同的租户中 我对存储帐户做了同样的事情 效果很好 我收到以下错误 有人可以给我一些关于我哪里出错的指示吗 是否可以在 Cosmos 数据库
  • eclipse:调试以编程方式启动的进程

    我正在通过 Eclipse 中的另一个 java 进程以编程方式执行 java 进程 Process process Runtime getRuntime exec command envp dir 有没有办法告诉eclipse调试子进程
  • E2009 不兼容的类型:“参数列表不同”

    我收到以下错误 E2009 不兼容的类型 参数列表不同 然而我不同意 看看定义我看不出有什么区别 这是记录定义 type TFastDiv record private DivideFunction function const Buffe
  • 哪种 TypeScript 配置会产生最接近 Node.js 16 功能的输出?

    Node js 16 最近发布 带来了对 ES2021 的更新支持以及对 ES 模块的稳定支持 如何配置 TypeScript 来输出利用所有这些新功能的 JavaScript 代码 从 Node js 开始16 0 0 100 支持ES2
  • 顺利改变CSS

    我的情况如下 我有以下功能 var showHideMemberContent function if isHidden false showHideMemberContent text Member Content main css he
  • 对 Volatile.Read/Write 的理解

    我试图理解 C Volatile 类 正如我读到的 The Volatile Write方法强制写入位置中的值 到呼叫点 此外 任何较早的程序订单 加载和存储必须在调用 Volatile Write 之前发生 The Volatile Re