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

Multithreading 确定在多核系统上首先发生的存储到内存?,multithreading,memory,concurrency,cpu,memory-barriers,Multithreading,Memory,Concurrency,Cpu,Memory Barriers,假设我有两个独立的线程,每个线程都在自己的CPU上运行 两者都试图同时写入共享内存,我如何知道哪个值将首先存储到内存中/将获得最新的验证 或者某些内存一致性模型会确保这是不可能的吗 如果是这样,怎么办?如果两个线程同时向同一内存写入,根据定义,无法知道写入的顺序(否则就不会是“同时”) 即使有,如果其中一个延迟一纳秒会发生什么?“同时”在多核系统中没有真正的意义。您是指执行store指令的时刻(实际上是一个时间跨度)、将值放入核心本地存储缓存的时刻、将存储缓存刷新到CPU共享缓存的时刻(请注意,

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

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

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


如果是这样,怎么办?

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

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

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

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