如果确定已经在缓存里面,那是同步的。
但 CPU 核心写入缓存之前可能还有其它前置操作,正在某个写入 l1 cache 的队列里面等着呢。此时其它核心可能读到脏数据。而程序员又没法确定是否数据真的写入到缓存里面。所以还是乖乖使用同步工具吧。
如果是高级语言没有对应到底层的单一 word 变量,而是对应到 16 字节,32 字节多个变量跨了 cache line. 此时缓存同步协议也没法保证它们读写顺序是一致的。所以才会有 acquire, release, relaxed, ordered 这几个修饰。
综上所述。如果多个线程想要访问同一块数据,就应该用上同步工具。内存屏障、原子变量、锁等等,根据需求从开销小的里面选一个就行了。
话说,一般的锁带了内存屏障和事务串行化两个功能。后者,串行化这个功能,在单线程实现的协程里面也需要用到。可见是更加抽象的能力。
【 在 wjhtingerx 的大作中提到: 】
: 就是一个线程修改了变量,在自己缓存里,其他线程不能及时发现这个修改?
--
FROM 120.41.146.*