gpt4 book ai didi

C volatile 内存模型

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:00 25 4
gpt4 key购买 nike

volatile 关键字是否强制跨线程可见?例如:

volatile int bar;
mutex mut;

void foo()
{
bar = 4;

// (*) Possible other thread changes to `bar`. No instructions here,
// just time that passes.

lock(&mut);

// (1) If 'bar' had _not_ been declared 'volatile', would the compiler
// be allowed to assume 'bar' is '4' here?
//
// (2) If 'bar' _is_ declared 'volatile', the compiler is
// forced to add the necessary instructions such that changes to
// 'bar' that may have occurred during (*) are visible here.

unlock(&mut)
}

不询问原子性或顺序(我假设 lock(mutex) 的任何合理实现都会在适合架构的情况下添加适当的内存和编译器栅栏)——只是一个可见性问题。

最佳答案

即使您没有将 bar 标记为 volatile,编译器也无法确定该值在此期间没有被修改,因为它是一个全局值.

因此它必须再次读取它(调用互斥函数,它可以是任何访问 bar 并更改它的函数),volatile 或不是。

local 值会有所不同,例如绑定(bind)在硬件寄存器上,该寄存器可能独立于程序执行而改变,其中需要 volatile 关键字.

关于C volatile 内存模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40946383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com