缓存共享布尔值的一致性c ++ 11

时间:2017-01-03 17:02:24

标签: c++ multithreading caching

我有一个结构数组,它是一个全局变量,其中一个结构成员是一个布尔值。特定CPU中的一个线程正在读取布尔值,而另一个CPU中的另一个线程可以通过将其赋值为true或false(my_array[index].bool = true/false)来定期更改布尔值。

据我所知,不使用任何形式的同步机制都会导致未定义的行为。

然而,假设:

  1. 在我的实施中,sizeof(bool)==1
  2. 并从此previous post,将一个字节的布尔变量设置为true / false将是x86_64位系统上的原子操作,
  3. this answer第3段建议MESIF协议将保持多个核心的缓存一致(包括不同核心的L1私有缓存)
  4. 我的代码只能运行在64位x86架构上,并带有gcc 4.8.4编译器优化标志O3
  5. 我可以肯定地说,在上述条件下,我可以在不使用互斥锁等同步机制的情况下逃脱,并且没有未定义的行为吗?

1 个答案:

答案 0 :(得分:3)

不,你不能肯定地说,因为没有标准提供这种保证。当你"合成"通过结合来自许多地方的信息并最终依赖于您无法想到任何可能失败的方式来保证,您没有确定性。

有很多人以这种方式认为他们有确定性,然后事情以他们想不到的方式失败。也就是说,我无法想到任何可能失败的方式,但我不会依赖它。

请注意,您不应期望内存操作提供任何排序​​,只是一个线程中的更改最终会在另一个线程中可见。特别是,您不能假设看到对特定布尔值的更改的线程将看到在代码中出现之前的任何内存操作。编译器和CPU在实践中可以自由地重新排序内存操作。

所以,即使有保证,你也不能使用它。甚至使用它作为布尔值来关闭线程,例如在一个线程中关闭while (!shutdown) do_work();而在另一个线程关闭shutdown = true;是有风险的。如果编译器可以证明do_work()无法修改shutdown,它可以优化shutdown的检查,并且循环可能永远不会终止。