- 主题:多核多线程共享一个全局变量,会有缓存一致性的问题吗?
就是一个线程修改了变量,在自己缓存里,其他线程不能及时发现这个修改?
--
FROM 144.34.185.*
不会,只要写入缓存,缓存就是一致的,比如,mesi协议就保证了
--
FROM 61.48.14.*
每个核都有自己的缓存哦,怎么知道同步呢
【 在 stub 的大作中提到: 】
: 不会,只要写入缓存,缓存就是一致的,比如,mesi协议就保证了
--
FROM 144.34.185.*
【 在 wjhtingerx 的大作中提到: 】
: 每个核都有自己的缓存哦,怎么知道同步呢
:
:
mesi协议保证的
--
FROM 223.160.130.*
如果确定已经在缓存里面,那是同步的。
但 CPU 核心写入缓存之前可能还有其它前置操作,正在某个写入 l1 cache 的队列里面等着呢。此时其它核心可能读到脏数据。而程序员又没法确定是否数据真的写入到缓存里面。所以还是乖乖使用同步工具吧。
如果是高级语言没有对应到底层的单一 word 变量,而是对应到 16 字节,32 字节多个变量跨了 cache line. 此时缓存同步协议也没法保证它们读写顺序是一致的。所以才会有 acquire, release, relaxed, ordered 这几个修饰。
综上所述。如果多个线程想要访问同一块数据,就应该用上同步工具。内存屏障、原子变量、锁等等,根据需求从开销小的里面选一个就行了。
话说,一般的锁带了内存屏障和事务串行化两个功能。后者,串行化这个功能,在单线程实现的协程里面也需要用到。可见是更加抽象的能力。
【 在 wjhtingerx 的大作中提到: 】
: 就是一个线程修改了变量,在自己缓存里,其他线程不能及时发现这个修改?
--
FROM 120.41.146.*
所以有volatile关键字
【 在 wjhtingerx 的大作中提到: 】
: 就是一个线程修改了变量,在自己缓存里,其他线程不能及时发现这个修改?
--
FROM 222.94.39.*
看到这里,我又想起volatile,这个关键词是只约束编译器,不会针对不同平台有cache相关的操作吧?
【 在 hgoldfish 的大作中提到: 】
: 如果确定已经在缓存里面,那是同步的。
: 但 CPU 核心写入缓存之前可能还有其它前置操作,正在某个写入 l1 cache 的队列里面等着呢。此时其它核心可能读到脏数据。而程序员又没法确定是否数据真的写入到缓存里面。所以还是乖乖使用同步工具吧。
: 如果是高级语言没有对应到底层的单一 word 变量,而是对应到 16 字节,32 字节多个变量跨了 cache line. 此时缓存同步协议也没法保证它们读写顺序是一致的。所以才会有 acquire, release, relaxed, ordered 这几个修饰。
: ...................
--
FROM 223.104.40.*
c++ memory model就是解决这个问题的
--
FROM 123.119.160.*
硬件都替你做了,你什么都不要担心
世界上确实存在non cache coherence的系统,比如intel scc,这个时候才需要软件来管理
不过普通人一辈子也不可能碰上这种系统的
【 在 wjhtingerx 的大作中提到: 】
: 每个核都有自己的缓存哦,怎么知道同步呢
--
FROM 107.204.171.*
smp架构用mesi协议,numa架构下的如何保证缓存一致?
【 在 stub 的大作中提到: 】
: 不会,只要写入缓存,缓存就是一致的,比如,mesi协议就保证了
--
FROM 121.195.188.*