确定将在多核系统上首先发生的内存存储?

时间:2013-12-02 11:32:07

标签: multithreading memory concurrency cpu memory-barriers

假设我有两个单独的线程,每个线程都运行在自己的CPU上。

两者都试图同时写入共享内存,如何知道哪个值将首先存储到内存中/将获得最新的版本?

或者某些内存一致性模型会确保这是不可能的吗?

如果是这样的话?

2 个答案:

答案 0 :(得分:2)

“同时”在多核系统中并没有真正的意义。是指执行存储指令的时刻(实际上是一段时间),将值放入核心本地存储缓存的那一刻,将存储缓存刷新到CPU共享缓存的那一刻(请注意那里)可能是核心子集具有共享缓存的CPU,或者当缓存刷新到内存时?您希望使用哪个核心系统视图来观察结果? (在四核系统中,很可能当核心1和核心2都写入值时,核心3和核心4会以不同的顺序观察写入。)

CPU有办法确保两个写入具有有保证的全局顺序(内存屏障和互锁的加载/存储操作) - 除非您使用它们,否则结果未指定并且保证会令人惊讶。在C11和C ++ 11内存模型的情况下,它们是完全未定义的。

答案 1 :(得分:0)

如果两个线程同时写入同一个内存,根据定义,无法知道写入的顺序(否则它不会“同时”)。

即使有,如果其中一个延迟了纳秒,会发生什么?