如果我有一个要从一个线程写入并从另一个线程读取的单个 int,我需要使用std::atomic
, 以确保其值在内核之间是一致的,无论是否读取和写入它的指令在概念上是原子的。如果我不这样做,则可能是读取核心在其缓存中具有旧值,并且不会看到新值。这对我来说很有意义。
如果我有一些无法以原子方式读取/写入的复杂数据类型,我需要使用一些同步原语来保护对它的访问,例如std::mutex
. 这将防止对象进入(或被读取)不一致的状态。这对我来说很有意义。
对我来说没有意义的是互斥锁如何帮助解决原子解决的缓存问题。它们的存在似乎只是为了防止对某些资源的并发访问,而不是将包含在该资源中的任何值传播到其他核心的缓存。我是否遗漏了一些处理这个问题的语义?