有人可以解释一下
WRITE_ONCE
和 READ_ONCE
的用法吗?
并且在内部
WRITE_ONCE
使用 volatile 限定符。为什么?
WRITE_ONCE
和READ_ONCE
如何解决缓存一致性问题?
*(易失性 __u8_alias_t *) p 和 (易失性 __u8_alias_t *) *p 之间的区别?
它们本身并没有做任何事情来解决并发性,但它们确实阻止编译器做一些愚蠢的事情,比如从同一内存位置加载一个值两次。例如,如果您正在访问硬件并且不想触发多个总线访问,这可能会影响未来的读写。
编译器会做这种事情,因为通常他们被允许优化对别名变量的访问,因为他们认为他们知道整个系统的行为方式。
要真正支持并发,您需要了解内存一致性以及在另一个值可见时可以保证哪些值对一个线程可见。这包括将操作声明为原子操作(通过读取较小部分的值并组合结果来避免“皮重”)和指定内存屏障。内存屏障允许您确保受另一个字段保护的值在访问时对另一个线程可见。