在像x86这样提供缓存一致性的CPU上,从实际角度来看这有什么用呢?我知道这个想法是使得在一个核心上进行的内存更新立即在所有其他核心上可见。这是一个有用的特性。然而,如果不编写汇编语言,人们不能过度依赖它,因为编译器可以将变量分配存储在寄存器中,而从未将它们写入内存。这意味着人们仍必须采取明确的步骤,以确保在当前线程中可见其他线程完成的工作。因此,从实际角度来看,缓存一致性达成了什么效果?
volatile
?)。相反,修改可能会在存储缓冲区中等待。几乎所有常用的CPU都是具有缓存一致性的,但非常少数的CPU具有与x86一样宽容的一致性模型。例如,可以查看http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html获取有关此主题的更多信息。假设您这样做:
lock(); //some synchronization primitive e.g. a semaphore/mutex
globalint = somevalue;
unlock();
globalint
的写入传播到其他核心。或者我们可以在库级别处理此问题,通过在unlock()
方法中放置同步原语。因此,我不确定这个示例是否是回答问题的好方法。您必须展示为什么上述两种方法之一也无法起作用。 - Evan Cox当你处理多个线程并从多个线程访问同一变量时,缓存一致性变得非常重要。在这种情况下,你必须确保所有处理器/核心在同时访问变量时看到相同的值,否则你将会遇到非常不确定的行为。
这并不需要锁定。如果需要,锁定代码将包括缓存刷新。主要需要确保不同处理器对同一缓存行中的不同变量进行的并发更新不会丢失。
硬件实现了缓存一致性,因为程序员不必担心在多核/多处理器环境下操作时所有线程是否看到内存位置的最新值。缓存一致性提供了一个抽象,即所有核心/处理器都在单个统一缓存上运行,尽管每个核心/处理器都有自己的独立缓存。
它还确保传统的多线程代码在新的处理器型号/多处理器系统上正常工作,而无需进行任何代码更改以确保数据一致性。