并发互锁和读取是否需要内存屏障或锁定?

2024-03-15

这是一个简单的问题,但是读完之后为什么需要内存屏障? https://stackoverflow.com/questions/3493931/why-do-i-need-a-memory-barrier我对此很困惑。

在下面的示例中,假设不同的线程重复调用 Increment 和 Counter:

class Foo{
    int _counter=0;
    public int Counter 
    {
        get { return _counter; }
    }

    public void Increment()
    {
        Interlocked.Increment(ref _counter);
    }
}

抱歉,如果我误解了为什么需要内存屏障? https://stackoverflow.com/questions/3493931/why-do-i-need-a-memory-barrier但似乎表明上面的课程可能没有提供新鲜保证当读取_counter的值时。重复访问 Counter 属性的线程是否会永远卡在 Counter 的旧值上(因为它缓存在寄存器中)?

之前是内存屏障还是锁return _counter;必要的?


return_counter之前是内存屏障还是锁;必要的?

是的,一点没错。考虑以下代码。

while (foo.Counter == 0)
{
  // Do something
}

问题是,如果循环内的内容足够简单,那么 C# 编译器、JIT 编译器或硬件将以这种方式优化代码。

int register = foo._counter;
while (register == 0)
{
  // Do something
}

甚至这个。

if (foo._counter == 0)
{
  START: 
  // Do something
  goto START;
}

请注意,我使用_counter代替Counter作为暗示该属性可能会被内联的一种方式。然后,更重要的是,JIT 编译器可能会“提升”对_counter在循环之外,以便只读取一次。

内存屏障不提供新鲜保证本身。它们的作用是阻止某些重新排序内存读写的软件或硬件优化。这新鲜保证确实更多的是副作用。

所以要结束你的事情Counter财产应该是这样的。

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

并发互锁和读取是否需要内存屏障或锁定? 的相关文章

随机推荐

  • WebClient 下载字符串与 WebBrowser 查看源代码不同

    我正在创建一个 C 4 0 应用程序来使用 Web 客户端下载网页内容 网络客户端功能 public static string GetDocText string url string html string Empty try usin
  • Chrome:检查元素与查看源代码

    我正在使用 Chrome 10 接收 XML 格式的 Web 服务响应 请求成功完成 然后我想查看结果的内容 我转到 检查元素 并查看所需的 XML 出于好奇 我还查看了源码 我非常确定 Chrome 的工作方式是 Inspect Elem
  • D3 防止双击缩放[重复]

    这个问题在这里已经有答案了 我有一个 D3 网络图 我正在尝试禁用双击缩放功能 我使用它进行缩放 var zoom d3 behavior zoom scaleExtent minZoom maxZoom zoom on zoom func
  • JMS QueueSender 线程安全吗?

    我想在多线程环境中使用 QueueSender Is QueueSender send 线程安全 No a MessageProducer QueueSender不是线程安全的 或者更具体地说 Session http java sun c
  • 计算泊松概率百分比

    当您在 Excel 或 OpenOffice Calc 中使用 POISSON 函数时 它需要两个参数 一个整数 一个 平均 数字 并返回一个浮点数 在 Python 中 我尝试了 RandomArray 和 NumPy 它返回一个随机泊松
  • 如何在iOS应用程序中运行可执行文件?

    我想在我的系统中运行一个可执行文件iOS应用程序 或者执行一些命令行命令 我认为这可以在 NSTask 的帮助下完成 但这似乎在 iOS 中不可用 它仅适用于 mac OS X So 如何从我的应用程序运行可执行文件 或者我如何从我的应用程
  • 我可以从特定IP(如果机器有两个IP)在PHP中打开套接字吗?

    我正在使用 PHPMailer 它使用fsockopen访问 SMTP 服务器 但该机器有两个具有不同反向 DNS 记录的 IP 所以在电子邮件标题中我得到以下内容 Received from one server tld HELO ano
  • XPath 1 查询和属性名称

    第一个问题 有什么办法可以得到name节点的属性
  • 如何分割日语文本?

    使用 Java 分割日语文本的最佳方法是什么 例如 对于以下文本 私 名前 私 行 我需要以下输出 私 名前 私 行 可以使用黑字吗 您可以使用java text BreakIterator String TEXT 私 名前 私 行 Bre
  • 使用 strptime 获取具有时区偏移的日期时间对象时出现 ValueError [重复]

    这个问题在这里已经有答案了 我正在尝试将日期字符串转换为日期时间对象 dt datetime datetime strptime 2011 07 15 13 00 00 00 00 Y m d H M S 但我收到这个错误 Tracebac
  • 为什么我无法从 WPF 运行截图工具?

    我创建了一个带有很多按钮的 WPF 窗口 每个按钮都运行不同的程序 例如 要运行 MS Word 我使用了 System Diagnostics Process Start C Program Files x86 Microsoft Off
  • 单元测试注释?

    我问自己应该对我的课程进行多深的 单元 测试 例如 我有以下简单的类 import javax annotation security PermitAll import javax ejb Singleton import javax ws
  • 为什么我的程序无法链接?

    我正在做一个 opengl 程序 并找到了一个可以实现我想要的功能的示例 但是当我尝试编译它时 使用gcc o picksquare picksquare c lglut I get tmp cchE9Z0Y o In function p
  • 如何让每次按下按钮时从字符串前面连续移动n个字符到末尾?

    每次按下按钮时 我都试图将字符串的第一个字符移到末尾 我的逻辑似乎只在按下按钮后一次又一次地显示第一个输出 string input string manipulated int initial input txtInput Text if
  • 将 eval 与字典结合使用,不会丢失 Python2 中导入的模块

    我有一个要在 python 程序中执行的字符串 我想将字符串中的一些变量 如 x 1 x 2 更改为其他变量 我之前使用过带有 2 个参数的 eval 第二个是带有 Replaced word new word 的字典 但现在我注意到我不能
  • 缩放 UIImageView 以适应屏幕宽度

    我有一个UIImageView使用里面的故事板创建UIViewController 我正在尝试重新调整图像的宽度以适应屏幕宽度并按比例重新调整高度 fImage setImage UIImage imageNamed f2345 jpeg
  • 你会如何将这个 JavaScript 正则表达式翻译成 Java?

    你会如何将这个 JavaScript 正则表达式翻译成 Java 它从字符串中删除标点符号 strippedStr str replace g 不需要s 里面的东西 你只需传递正则表达式 这里是一个字符类 public static voi
  • std::map 扩展初始值设定项列表会是什么样子?

    如果它真的存在的话 那会是什么呢 std map扩展初始化列表是什么样子的 我已经尝试了一些组合 嗯 我能想到的所有 GCC 4 4 的组合 但没有发现任何可以编译的结果 它存在并且运行良好 std map
  • 如何更改在应用内结算中成功购买产品后出现的 toast 消息

    用户购买产品后 我收到一条类似 谢谢 您的商品很快就会出现 的消息 现在这条消息来自市场一侧 但我想要一条自定义消息而不是这条消息 如何做同样的事情 或者至少如何删除这个 toast 通知 正如其他用户所说 您cannot从 Play 更改
  • 并发互锁和读取是否需要内存屏障或锁定?

    这是一个简单的问题 但是读完之后为什么需要内存屏障 https stackoverflow com questions 3493931 why do i need a memory barrier我对此很困惑 在下面的示例中 假设不同的线程