繁体   English   中英

原子写和读

[英]Atomic write and read

我想知道以下内容:

  1. 第一个线程写入原子变量,例如 std::atomic i。 第二个线程是否会在下一次加载操作中看到新值?

例如:

std::atomic<uint8_t> i=0;

thr1_func()
{
 i.store(1,std::memory_order_relaxed);//here is first step
}

thr2_func()
{
 while(!i.load(std::memory_order_relaxed);//here is next step
}

'i' 变量在存储操作后的第一次加载操作中会有新值吗? 或者“i”变量在第二次或其他命令执行时可能有新值?

提前谢谢你。

第二个线程是否会在下一次加载操作中看到新值?

如果下一个load操作发生在以该原子变量的修改顺序store之后,则该load从该store读取值。

有关完整详细信息,请参阅std::memory_order

修改顺序

对任何特定原子变量的所有修改都以特定于该原子变量的总顺序发生。

...

  1. 写-读一致性:如果对原子对象 M 的副作用(写)X 发生在 M 的值计算(读)B 之前,则评估 B 应从 X 或副作用 Y 获取其值在 M 的修改顺序中跟随 X

此外,在[atomics.order]标准中说

实现应该在合理的时间内使原子存储对原子负载可见。

实际上,这意味着编译器发出那些存储和加载指令,然后由硬件来传播存储的值并使其对其他 CPU 可见。 x86 CPU 使用存储缓冲区,因此存储的新值首先进入存储缓冲区,并在它离开存储缓冲区后的某个(小)时间对其他 CPU 可见。 在此期间,存储该值的 CPU 可以从存储缓冲区中将其读回,但其他 CPU 则不能。

更多信息:如何使一个线程中的内存存储在其他线程中“立即”可见?

这个答案: https : //stackoverflow.com/a/60740774/5637254

如果您需要知道加载是在存储之后发生还是存储尚未发生(即延迟加载直到存储)……您可以引入另一个变量,或使用“无效值”如零,然后进行“比较交换”检查对于这个无效值,load 可以知道 store 是否已经发生并且 store 可以检查 value 是否已经加载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM