我理解原子读取序列化由多个线程执行的读取操作。
我不明白的是用例是什么?
更有趣的是,我发现了一些原子读取的实现
static inline int32_t ASMAtomicRead32(volatile int32_t *pi32)
{
return *pi32;
}
与常规读取的唯一区别是 volatile 。是不是说原子读和volatile读一样?
最佳答案
I understand that atomic read serializes the read operations that performed by multiple threads.
这是相当错误的。如果没有存储不同值的写入,如何确保读取顺序?即使您既有读写操作,也不一定要序列化,除非正确的内存语义与读写操作结合使用,例如“随发布存储”和“随获取加载”。在您的特定示例中,内存语义是放松的。尽管在 x86 上,可以为每个加载暗示 acquire
语义,为每个存储暗示 release
(除非使用非临时存储)。
What I don't understand is what is the use case?
原子读取必须确保一次读取数据,并且没有其他线程可以在其间存储部分数据。因此,它通常确保原子变量的对齐(因为对齐机器字的读取是原子的)或使用更繁重的指令来解决非对齐情况。最后,它确保读取不会被编译器优化掉,也不会在该线程中的其他操作中重新排序(根据内存语义)。
Does it mean that atomic read is the same as volatile read?
简而言之,volatile
并非旨在用于此类用例,但有时在满足其他要求时也可能被滥用。对于你的例子,我的分析如下:
- int32_t 可能是一个或更少的机器字 - 好的。
- 通常,所有内容都至少对齐 4 字节边界,但在您的示例中不能保证
volatile
确保读取不会被优化掉- 不能保证它不会被处理器(x86 正常)或编译器(坏)重新排序
请引用Arch's blog和 Concurrency: Atomic and volatile in C++11 memory model了解详情。
关于multithreading - 原子读取的用例是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24050047/