multithreading - 原子读取的用例是什么

标签 multithreading atomic

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

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

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

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 并非旨在用于此类用例,但有时在满足其他要求时也可能被滥用。对于你的例子,我的分析如下:

  1. int32_t 可能是一个或更少的机器字 - 好的。
  2. 通常,所有内容都至少对齐 4 字节边界,但在您的示例中不能保证
  3. volatile 确保读取不会被优化掉
  4. 不能保证它不会被处理器(x86 正常)或编译器(坏)重新排序

请引用Arch's blogConcurrency: Atomic and volatile in C++11 memory model了解详情。

关于multithreading - 原子读取的用例是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24050047/

相关文章:

Java - 同步方法/ block

java - 理解java中的synchronizedlist

wpf - BackgroundWorker 和 WPF

java - 为什么调用空 Atomic 类的方法不会产生异常?

c - C11 中的原子阵列

C++11 内存排序——区别?

java - 如何安全实现Java插件安全?

python - 在类初始化中每 X 秒执行一次函数

set - 在 Redis 中使用 WATCH 实现 ZMOVE

c - 不可观察的原子是否同步内存?