gpt4 book ai didi

c# - MemoryBarrier 是否保证所有内存的内存可见性?

转载 作者:行者123 更新时间:2023-11-30 13:21:42 24 4
gpt4 key购买 nike

如果我理解正确,在 C# 中,一个 lock block 保证对一组指令的独占访问,但它也保证从内存中读取的任何内容都反射(reflect)了任何 CPU 缓存中该内存的最新版本.我们将 lock block 视为保护 block 内读取和修改的变量,这意味着:

  1. 假设您已在必要时正确实现锁定,这些变量一次只能由一个线程读取和写入,并且
  2. lock block 中读取会看到变量的最新版本,在 lock block 中写入对所有线程可见。

(对吗?)

第二点是我感兴趣的。是否有一些魔法只有在受lock block 保护的代码中读取和写入的变量才能保证新鲜,或者lock实现中使用的内存屏障 保证所有 内存现在对所有线程都同样新鲜?请原谅我对高速缓存如何工作的心理模糊,但我读到高速缓存包含几个多字节“行”的数据。我想我要问的是,内存屏障是否强制同步所有“脏”缓存行,或者只是一些,如果只是一些,是什么决定了同步哪些行?

最佳答案

If I understand correctly, in C#, a lock block guarantees exclusive access to a set of instructions...

没错。规范保证了这一点。

but it also guarantees that any reads from memory reflect the latest version of that memory in any CPU cache.

C# 规范对“CPU 缓存”只字未提。您已经离开了规范所保证的领域,进入了实现细节领域。不要求 C# 的实现在具有任何特定缓存架构的 CPU 上执行。

Is there some magic by which only variables read and written in code protected by the lock block are guaranteed fresh, or do the memory barriers employed in the implementation of lock guarantee that all memory is now equally fresh for all threads?

与其尝试解析您的非此即彼问题,不如说一下该语言实际保证的是什么。一个特殊的效果是:

  • 对变量的任何写入,无论是否为 volatile
  • 对可变字段的任何读取
  • 任何 throw

在某些特殊点保留特殊效果的顺序:

  • 读取和写入可变字段
  • 线程的创建和终止

运行时需要确保特效与特殊点的顺序一致。因此,如果在锁定之前读取了一个 volatile 字段,并在锁定之后写入,那么读取不能在写入之后移动。

那么,运行时是如何实现这一点的呢?打败了我。但是运行时肯定不需要“保证所有线程的所有内存都是新鲜的”。运行时需要确保某些读取、写入和抛出按时间顺序发生在特殊点上,仅此而已。

运行时特别要求所有线程遵守相同的顺序

最后,我总是通过将您指向此处来结束此类讨论:

http://blog.coverity.com/2014/03/26/reordering-optimizations/

读完之后,您应该了解即使在 x86 上当您随意删除锁时也可能发生的各种可怕事情。

关于c# - MemoryBarrier 是否保证所有内存的内存可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39602607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com