缓存由缓存硬件透明地控制到处理器,因此如果我们在C程序中使用volatile变量,我的程序如何保证每次从指定的实际内存地址而不是缓存中读取数据.
我的理解是,
Volatile关键字告诉编译器不应优化变量引用,并应按代码中的编程读取.
缓存由缓存硬件透明地控制,因此当处理器发出地址时,它不知道数据是来自缓存还是来自内存.
因此,如果我需要每次都需要读取一个内存地址,我怎样才能确保它不是从缓存引用而是从所需的地址引用?
有些怎么样,这两个概念并不合适.请说明它是如何完成的.
(想象一下我们在缓存中有回写策略(如果需要分析问题))
谢谢你,Microkernel :)
c computer-science volatile computer-architecture memorycache
Apple提供了一些有关同步变量甚至执行顺序的文档.我没看到的是有关CPU缓存行为的任何文档.Objective-C开发人员有什么保证和控制来确保线程之间的缓存一致性?
考虑以下情况,其中变量在后台线程上设置但在主线程上读取:
self.count = 0;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
self.count = 5;
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%i", self.count);
});
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,是否应该计数?
更新1
线程间通信中的文档保证共享变量可用于线程间通信.
在两个线程之间传递信息的另一种简单方法是使用全局变量,共享对象或共享内存块.
在这种情况下,这不是必需的吗?这与内存屏障和易失性变量中的文档相矛盾:
但是,如果该变量在另一个线程中可见,则此类优化可能会阻止另一个线程注意到对它的任何更改.将volatile关键字应用于变量会强制编译器在每次使用时从内存加载该变量.
因此,我仍然不知道是否需要volatile,因为编译器可以使用寄存器缓存优化,或者如果不需要,因为编译器以某种方式知道它是"共享"的东西.
关于共享变量是什么或者编译器如何知道它的文档不是很清楚.在上面的例子中,是否计算共享对象?假设count是一个int,那么它不是一个对象.它是共享的内存块还是只适用于__block声明的变量?对于非块,非对象,非全局共享变量,可能需要volatile.
更新2
对于每个人来说,这是一个关于同步的问题,但事实并非如此.这是关于iOS平台上的CPU缓存行为.