为什么读取由其他线程修改的变量既不是旧值也不是新值

1a1a11a

有人提到过,例如c ++,当在一个线程中写入并在第二个线程中读取同一对象时会发生什么?(是否安全?)如果两个线程在没有原子和锁的情况下对同一个变量进行操作,则读取该变量既不会返回旧值,也不会返回新值。

我不明白为什么会发生这种情况,我找不到这样的例子,我认为加载和存储始终是一条不会被中断的指令,那么为什么会发生这种情况?

埃里克·波斯蒂奇(Eric Postpischil)

例如,C可以在仅支持对内存的16位访问的硬件上实现。在这种情况下,加载或存储32位整数需要两条加载或存储指令。执行这两个指令的线程可能在它们的执行之间被中断,另一个线程可能会在第一个线程恢复之前执行。如果其他线程加载,则可能加载一个新零件和一个旧零件。如果存储了,它可能会存储两个部分,并且第一个线程在恢复时将看到一个旧部分和一个新部分。其他此类混合也是可能的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试生成唯一的ID,该ID既不是整数,也不是纯文本中的其他值

订阅值既不是数组也不是指针

为什么一个空的javascript对象既不是true也不是false?

为什么有些方法既不是私有的也不是公共的?

声明类型既不是“ void”也不是“ any”的函数必须返回一个值

Scala - 返回一个既不是 True 也不是 False 的布尔值

分配数组元素值时,C下标值既不是数组,也不是指针,也不是矢量

Python的in(__contains__)运算符返回布尔值,该布尔值既不是True也不是False

既不是句法也不是语义的错误?

'NgIf' 既不是 'ComponentType' 也不是 'DirectiveType'

Typescript-声明的类型既不是'void'也不是'any'的函数必须返回一个值

错误TS2355:声明的类型既不是“ void”也不是“ any”的函数必须返回一个值

metadata.finalizers[0]:无效值:“foregroundDeletion”:名称既不是标准终结器名称也不是完全限定的

TypeScript错误(角度):声明类型既不是“ void”也不是“ any”的函数必须返回一个值

当我使用其他变量时,为什么要用Java复制而不是创建新的Instant?

为什么数组有时通过值传递而不是其他时候传递?

MySQL如何从一个表中选择列值既不是X又是Y的所有记录

找出既不是第k个最大值也不是第k个最小值的元素的时间复杂度?

当我在TypeScript中使用React Hook时为什么面对“既不是React函数组件也不是自定义React Hook函数的...”

为什么在C ++中变量不是左值?

为什么文字和临时变量不是左值?

为什么变量“ y”的值是5?不是7?

为什么我的变量返回 null 而不是定义的值

为什么将新数组分配给变量会更改其引用值而不是值?

既不是GROUPED也不是AGGREGATED的X列-StandardSQL / BigQuery

空文件构造函数既不是文件也不是目录

既不是URL也不是URN的URI是否存在?

既不是nth-child也不是nth-of-type

C函数指针既不是函数也不是指针