我见过一些关于Linux内存障碍的文档。它提到有读取内存屏障和写入内存屏障。我很容易理解写内存屏障的含义,我没有看到读内存屏障的必要性!
只是保持内存区域的读取顺序吗?如果订单是反向的,我认为价值仍然是正确的,不是吗?
读存储器屏障是这样的:读操作屏障读操作还是写操作屏障读操作?
让我感到困惑!
答案 0 :(得分:2)
读取内存屏障会在读取之前强制读取,然后再读取。例如,这对于内存映射I / O很有用,其中从内存中读取实际上是从连接到系统的某些设备读取的。
MMIO读取需要按程序顺序执行,因为它们可能会对您正在读取的设备产生副作用。例如,如果设备是流数据,则读取该值可能会导致设备用新值替换它。它还可能导致可能在不同的MMIO位置触发更改的操作。因此,必须对这两个位置进行读取,因为结果取决于它们的执行顺序。
答案 1 :(得分:1)
有时甚至必须订购没有副作用的读数。请考虑以下习语:
extern some_flag_type message_is_ready_flag;
extern some message_type message_data;
while(message_is_ready_flag) // First read
continue;
... = message_data; // Second read
假设某个其他线程首先写入message_data,然后写入message_is_ready_flag。
如果在上面的代码中,第二次读取首先发生,则可能无法读取预期值。请注意,写入线程需要使用相应的写入器屏障。这就是为什么Linux文档指出“读取障碍通常应该与写入障碍配对”。