温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
面试官问你玩的太有什么用?如果你只回答防止编译器优化,大概率还会被继续追问防止什么优化什么时候该用?它能不能保证现场安全?像这类型的面试题还有很多,我都给你整理好了,有需要的同学可以私我领取接收最核心的意思我tell是在告诉编译器这个对象的值可能在当前代码看不到的地方发生的变化,所以每次访问的时候都要按照语言规则真正的去读或写这个对象,不能够随便把之前读到的值一直当成最新的值。最典型的场景之一是中断和主程序共享变量,比如说主循环一直等待一个完成的标志,中断发生以后把标志改成了一错误写法的风险是编译器如果看不到主循环内部有人修改,这个变量可能生成不符合你预期的访问的方式。把这个共享标志声明为whateverel,可以要求每次判断时重新访问它。第二个常见的场景是内存映射寄存器,你读取状态寄存器的时候呢,只可能有硬件来改变的你写控制。
01:00
存器时,每次企业操作都可能对应真实的硬件的动作。头文件里面的寄存器定义通常会带while t, 就是为了让这些访问不能够被当成普通的内存随意的省略或合并。第三个场景可能是某些被DNA或者说其他执行环境修改的对象,但这里边呢,一定要结合平台编译器和具体的内存模型,不能够看到外部会改就机械的加verlael。接下来这道题最容易打错的地方,Verlael不等于原子操作,也不等于现场安全。假设两个任务都执行C的加加,这不是一个不可分割的动作,它通常包含了读取、加1写回。就算靠的是whateveraletile,两个任务仍可能同时读到旧值。最后丢失的一次更新。正确的工具可能是临界区域互斥所,原子操作或其他的同步机制要根据运行的环境来选择。可能有人会问,既然现在有原子类型,是不是verlaile就没有用了?不是的,原子类型解决并发访问语义vla在千隆。
02:00
是迷人,常用于硬件、寄存器等特殊的访问,他们解决的不是同一个问题,不能够互相替代的。所以呢,回到开头whatever了,T最重要的不是被一句防止优化,而是知道他约束编译器的访问,却不替你解决并发同步。
我来说两句