在 .NET 中配对 MemoryBarrier 的目的是什么?

What's the purpose of pairing MemoryBarrier in .NET?

提问人:user22155685 提问时间:10/26/2023 最后编辑:Theodor Zouliasuser22155685 更新时间:10/26/2023 访问量:95

问:

https://www.albahari.com/threading/part4.aspx 中的示例代码

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);
    }
  }
}

障碍 1 和 4 阻止此示例写入“0”。障碍 2 和 3 提供了新鲜度保证:它们确保如果 B 在 A 之后运行,读取_complete将计算为 true。

我明白的目的是提供一个完整的内存屏障,以便它上面的代码和下面的代码不会跳过,但是屏障 2 在这里有什么作用?Barrier 2 之后没有代码,为什么作者仍然使用障碍来阻止没有现有代码跳过障碍?障碍 2 和 3 如何协同工作以提供新鲜度保证?Thread.MemoryBarrier()

C# .NET 多线程处理

评论

0赞 Theodor Zoulias 10/26/2023
相关:为什么使用多个 Thread.MemoryBarrier() 调用?
1赞 user22155685 10/26/2023
@TheodorZoulias问题已被修改为专注于缓存部分,但这个问题是关于为什么要使用一对内存屏障
0赞 Carl Prothman 10/26/2023
以前的回答 (9 年, 8 个月前问过) stackoverflow.com/questions/21652938/...

答:

2赞 Carl Prothman 10/26/2023 #1

包含障碍 2 以确保将来的任何代码更改都不会意外引入排序问题。特别是,它强制立即将写入刷新到主内存。

评论

0赞 user22155685 10/26/2023
有那么容易吗?但作者说“障碍 2 和 3 提供了新鲜度保证”,这对如何协同工作,尤其是它们采用不同的方法?
0赞 user22155685 10/26/2023
您的意思是 Barrier 1 主要用于围栏目的,而 Barrier 2 用于刷新缓存目的?
1赞 Carl Prothman 10/26/2023
是的,就这么简单。但你需要知道为什么......如果它是在写入之后放置的,则它会强制立即将写入刷新到主内存。如果它放在读取之前,则保证重新读取。