什么是原子读取的用例

时间:2014-06-05 01:07:20

标签: multithreading atomic

我理解原子读取序列化由多个线程执行的读取操作。

我不明白的是用例是什么?

更有趣的是,我发现了一些原子读取的实现

static inline int32_t ASMAtomicRead32(volatile int32_t *pi32)
{
    return *pi32;
}

常规读取的唯一区别是volatile。这是否意味着原子读取与易失性读取相同?

1 个答案:

答案 0 :(得分:2)

  

我理解原子读取序列化由多个线程执行的读取操作。

这是错误的。如果没有存储不同值的写入,如何确保读取顺序?即使你同时具有读写功能,它也不一定是序列化的,除非正确的存储器语义与read和amp;同时使用。写操作,例如'store-with-release'和'load-with-acquire'。在您的特定示例中,内存语义是放松的。虽然在x86上,可以为每个加载暗示acquire语义,为每个商店暗示release(除非使用非临时存储)。

  

我不明白的是用例是什么?

原子读取必须确保一次性读取数据,并且没有其他线程可以在其间存储数据的一部分。因此,它通常确保原子变量的对齐(因为对齐的机器字的读取是原子的)或使用更重的指令来解决非对齐的情况。最后,它确保读取不会被编译器优化,也不会在此线程中的其他操作中重新排序(根据内存语义)。

  

是否意味着原子读取与易失性读取相同?

简而言之,volatile并不是针对这样的用例,但有时也可以在满足其他要求时滥用它。对于您的示例,我的分析如下:

  1. int32_t可能是机器字或更少 - 好的。
  2. 通常,所有内容都至少在4个字节边界上对齐,但在您的示例
  3. 中无法保证
  4. volatile确保未优化读取
  5. 不保证它不会被处理器(对于x86来说好)或由编译器(坏)重新排序
  6. 有关详细信息,请参阅Arch's blogConcurrency: Atomic and volatile in C++11 memory model