繁体   English   中英

在这些条件下设置可变原子

[英]Is Setting a Variable Atomic in THESE conditions

在这种情况下,我有一个状态变量。 int state =(2,1,0)和一个无限循环:

ret = BoolCompareAndSwap(state, 1, 2)
if (ret) {
    // Change something ...
    state = 0;
}

这个状态设置是原子的吗? 假设设置变量,您必须:

  1. 从内存中取出
  2. 变更价值
  3. 设定新值

如果有其他线程来比较该变量,那么它将是原子的,因为直到将其重新设置在内存中,实际值才会改变,对吗?

严格来说,如果C编译器按位编写状态,则它们仍然符合标准。 写入前几位后,其他一些线程可以读取任何类型的垃圾。
大多数编译器都不做这种事情(可能是较旧的4位处理器甚至更窄的编译器除外……),因为这会降低性能。

而且,在实际中更相关的是,如果有任何其他线程向状态写入(而不是仅读取),则如果您不保护所描述的代码不受竞争条件的影响,则该写入的值可能会丢失。

附带说明,所描述的状态更改(读取,修改,写入)绝不是原子的。 但是,当这种非原子性很脆弱时,这个问题是正确的,这就是我上面试图回答的问题。

更笼统地说,考虑并发访问的所有可能组合是一种有效的保护机制。 但是,它在许多方面都非常昂贵(设计工作,测试工作,维护期间的风险...)。
仅当这些成本总计小于预期的节省(可能是性能)时,才可以这样做,而不是使用适当的保护机制。

暂无
暂无

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

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