memorybarriervsmemoryimpactonmemorycachecoherence时序简化问题:与memorybarrier相比,互锁操作导致的内存缓存一致有区别吗做爱的时间(或“刷新”)?让我们在C#中考虑-与Thread.MemoryBarrier()的任何互锁操作。我相信存在差异。背景:关于内存屏障,我读得很少——所有这些都对防止特定类型的内存交互指令重新排序有影响,但我找不到关于它们是否应该立即刷新读/写队列的一致信息。我实际上发现很少有消息来源提到不能保证操作的即时性(只保证特定的重新排序)。维基百科例如:“但是,需要明确的是,这并不意味着障碍完成时任何操作都会完成;只有已完成操作(当它们完成时)的顺序是有保证的”Freebsd.org(障碍是特定于硬件的,所以我猜测特定的操作系统无关紧要):“内存屏障只是确定内存操作的相对顺序;它们不保证内存操作的时间”另一方面,互锁操作-从他们的定义-导致所有内存立即刷新缓冲区用保证更新的最新值更新,导致内存子系统用该值锁定整个缓存行,防止来自其他CPU/内核的任何访问(包括读取),直到操作完成。我是改正了还是错了?免责声明:这是我在这里的原始问题的演变。.NET中的变量新鲜度保证(易失性与易失性读取)EDIT1:关于互锁操作的固定声明-内联文本。编辑2:完全删除演示代码+讨论(因为有些人抱怨信息太多)要了解C#互锁操作,您需要了解Win32互锁操作。“纯”互锁操作本身只会影响操作直接引用的数据的新鲜度。但在Win32中,互锁操作过去意味着完整的内存屏障。我相信这主要是为了避免破坏新硬件上的旧程序。所以InterlockedAdd做了两件事:互锁添加(非常便宜,不命中缓存)和完整的内存屏障(相当繁重的操作)。后来,微软意识到这样做很昂贵,并且每个操作都有增量版本,没有或部分内存屏障。所以现在(在Win32世界中)几乎所有东西都有四个版本:例如InterlockedAdd(全栅栏)、InterlockedAddAcquire(读栅栏)、InterlockedAddRelease(写栅栏)、纯InterlockedAddNoFence(无栅栏)。在C#世界中,只有一个版本与“经典”InterlockedAdd相匹配——它还具有完整的内存栅栏。简短回答:CAS(互锁)操作已经(并且可能会)成为最快的缓存。背景:–通过单个不可中断指令支持HW中的CAS操作。与线程调用的内存屏障相反,线程调用的内存屏障可以在放置屏障后立即交换,但在执行任何读/写之前(因此仍然满足屏障的一致性)。-CAS操作是大多数(如果不是全部)高级同步结构(互斥体、信号量、锁——看看它们的实现,你会发现CAS操作)的基础。如果它们不能保证即时的跨线程状态一致性,或者如果存在其他一些更快的机制,则不可能使用它们。至少在Intel设备上,一堆机器代码操作可以用LOCK前缀作为前缀,这确保以下操作被视为原语操作,即使底层数据类型不能一次性适应数据总线,例如LOCKREPNESCASB将扫描一串字节以查找终止零,并且不会被其他线程中断。据我所知,MemoryBarrier构造基本上是一个基于CAS的自旋锁,它使线程等待满足某些条件,例如没有其他线程有任何工作要做。这显然是一个更高级别的构造,但别搞错了,那里有一个条件检查,它可能是primefaces,它可能是CAS保护的,当你到达内存屏障时,你仍然需要支付缓存行的代价。以上就是《C#学习教程:内存屏障vs内存对内存缓存一致性时序共享的影响》的全部内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
