当另一个线程可能正在写入时,单个整数是否可以安全读取?

use*_*993 1 c++ multithreading

我有很多不同的线程写入和读取一些数据的情况,互斥开销真的会降低性能,所以我试图尽可能地减少它们的使用和持续时间。

参考这个:为什么阅读不是线程安全的?

接受的答案说,在可能被覆盖的同时读取数据可能会产生损坏的结果。但它没有指定多少数据。我想大数组读取与单个整数读取不同,因为 cpu 不会一点一点地写入整数,对吗?

那么从这个读取整数(为 x64 编译时为 64 位)是否安全?

Rev*_*lot 5

简而言之:不,这是 C++ 标准的 UB,您应该遵守此规则。

更长的解释:在 x86 中,读取和写入不大于字大小的正确对齐的内存位置是原子的。但是,如果没有同步,编译器可以以不明显的方式优化代码:缓存值、重新排序读取等。在这些情况下,您可能会发现一个线程的更改在另一个线程中根本不可见。如果您希望某些事情按特定顺序发生,则可能会发生其他有趣的事情。

使用atomic<T>类型。它面向性能,甚至可能在支持它的平台上是无锁的。