代码之家  ›  专栏  ›  技术社区  ›  Ricky Lung

忽略平稳变化的浮点值的读写竞争条件是否安全?

  •  2
  • Ricky Lung  · 技术社区  · 16 年前

    当我尝试将游戏引擎的动画更新函数和物理模拟放在一个单独的线程中执行时,我意识到在编写线程(动画、物理)和读取器线程(rende如果两个线程同时访问这些值。

    我的问题是,即使浮点赋值不是原子的,这样的读写争用条件是否会导致读者所看到的原始平滑变化值的有线/突然变化?

    此外,在我的情况下,我可以容忍少量的错误,因为这样的错误不会累积到下一个渲染帧。

    3 回复  |  直到 16 年前
        1
  •  0
  •   Kylotan    16 年前

    从理论上讲,如果在更新指数和更新尾数之间进行上下文切换,可能会出现很大程度的错误,但我怀疑目前使用的大多数平台或架构是否允许发生这种情况。

        2
  •  1
  •   Romain    16 年前

    据我所知,你可以忽略竞争条件,只要你一次只在线程上写可验证的,你不在乎你的阅读线程是否使用最新版本。

    根据我的理解,编写浮点应该是原子的,尽管我认为这可能依赖于平台。

        3
  •  1
  •   casperOne    16 年前

    Section 12.5 of ECMA-334 (C语言规范)规定:

    读取和写入以下数据 类型应该是原子的:bool,char, byte,sbyte,short,ushort,uint,int, 浮点和引用类型。

    为此,您不应该看到由于读取和写入浮点而导致的任何损坏(假设您不是指这里的double,即 保证是原子写的)。

    然而,需要注意的是,虽然值的写入被保证是原子的,但是读/写的顺序是 保证,除非你用的是特定的东西,比如 Monitor.Enter .

    不过,输入有点重,所以我建议使用 volatile keyword 当声明变量时。假设这个变量的读/写是唯一需要发生的事情,它将保证读/写是按顺序完成的。

    推荐文章