我理解原子读取序列化由多个线程执行的读取操作。
我不明白的是用例是什么?
更有趣的是,我发现了一些原子读取的实现
static inline int32_t ASMAtomicRead32(volatile int32_t *pi32)
{
return *pi32;
}
常规读取的唯一区别是volatile。这是否意味着原子读取与易失性读取相同?
答案 0 :(得分:2)
我理解原子读取序列化由多个线程执行的读取操作。
这是错误的。如果没有存储不同值的写入,如何确保读取顺序?即使你同时具有读写功能,它也不一定是序列化的,除非正确的存储器语义与read和amp;同时使用。写操作,例如'store-with-release'和'load-with-acquire'。在您的特定示例中,内存语义是放松的。虽然在x86上,可以为每个加载暗示acquire
语义,为每个商店暗示release
(除非使用非临时存储)。
我不明白的是用例是什么?
原子读取必须确保一次性读取数据,并且没有其他线程可以在其间存储数据的一部分。因此,它通常确保原子变量的对齐(因为对齐的机器字的读取是原子的)或使用更重的指令来解决非对齐的情况。最后,它确保读取不会被编译器优化,也不会在此线程中的其他操作中重新排序(根据内存语义)。
是否意味着原子读取与易失性读取相同?
简而言之,volatile
并不是针对这样的用例,但有时也可以在满足其他要求时滥用它。对于您的示例,我的分析如下:
volatile
确保未优化读取有关详细信息,请参阅Arch's blog和Concurrency: Atomic and volatile in C++11 memory model。