gpt4 book ai didi

c++ - 共享 bool 值的缓存一致性 c++11

转载 作者:行者123 更新时间:2023-11-30 02:27:39 25 4
gpt4 key购买 nike

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

我明白不使用任何形式的同步机制会导致未定义的行为。

但是,假设:

  1. 在我的实现中,sizeof(bool)==1,
  2. 从这个previous post ,将一个字节的 bool 变量设置为 true/false 将是 x86_64 位系统上的原子操作,
  3. this answer paragraph 3 建议 MESIF 协议(protocol)将保持多个核心的缓存一致(包括不同核心的 L1 私有(private)缓存)
  4. 我的代码只能在带有 gcc 4.8.4 编译器优化标志 O3 的 64 位 x86 架构上运行

我可以肯定地说,在上述条件下,我可以在不使用互斥锁等同步机制并且没有未定义行为的情况下逃脱吗?

最佳答案

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

有很多这样的例子,人们认为他们以这种方式有把握,然后事情以他们想不到的方式失败了。也就是说,我也想不出任何失败的方式,但我不会依赖它。

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

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

关于c++ - 共享 bool 值的缓存一致性 c++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com