假设我在一个类中有一个整型变量,这个变量可能会被其他线程同时修改。写入受互斥体保护。我也需要保护读取吗?我听说有一些硬件架构,如果一个线程修改一个变量,另一个线程读取它,那么读取结果将是垃圾;在这种情况下,我确实需要保护读取。不过我从未见过这样的架构。
此问题假设单个事务仅包含更新单个整数变量,因此我不担心事务中可能涉及的任何其他变量的状态。
最佳答案
原子读取
如前所述,它依赖于平台。在 x86 上,该值必须在 4 字节边界上对齐。通常对于大多数平台,读取必须在单个 CPU 指令中执行。
优化器缓存
优化器不知道您正在读取由不同线程修改的值。声明值 volatile
有助于实现这一点:优化器将为每次访问发出内存读/写,而不是尝试将值缓存在寄存器中。
CPU 缓存
不过,您可能会读到一个陈旧的值,因为在现代架构上,您有多个内核和单独的缓存,这些缓存不会自动保持同步。您需要一个读取内存屏障,通常是特定于平台的指令。
在 Wintel 上,线程同步函数会自动添加一个完整的内存屏障,或者您可以使用 InterlockedXxxx功能。
MSDN:Memory and Synchronization issues , MemoryBarrier宏
[编辑] 另请参阅 drhirsch 的评论。
关于c++ - 读取一个在没有锁定的情况下同时修改的整数变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1350994/