【问题标题】:Are race conditions that write the same value safe?写入相同值的竞争条件是否安全?
【发布时间】:2021-01-11 22:58:50
【问题描述】:

假设我有一些使用共享内存的多线程程序,其中多个线程随机覆盖某个 multi-byte 变量的值(例如 int 或 double ),有时会相互碰撞(也称为竞态条件),并且也会随机从同一变量中读取值。

假设所有线程总是将相同的值写入内存地址(例如,每个线程都执行x = 1000) - 如果一个线程在另一个线程正在读取的确切时刻读取变量/正在覆盖它,变量是否保证具有正确的值?或者内存会以某种方式被随机的东西覆盖吗?

也就是说,如果所有线程总是写x = 1000,那么一个线程可以读x并得到1000以外的东西吗?

【问题讨论】:

  • @Matthieu 没用。
  • 例如考虑一个存储器,它需要在写入之前先擦除一个存储单元(如某些闪存)。那么您的竞速读取可能会在擦除周期之后但在写入值之前获得。
  • @Matthieu volatile 不会使任何东西成为线程安全的。
  • 同时读写 --> 可能是总线故障。 “曾经有一个名为 Lime 的程序;它的所有写操作同时进行;直到有一天它读到;它说的值相同;......并以一滩污垢告终。” ??????
  • 没有。 volatile 确保 代码 实际上正在执行内存访问,并且没有做出允许对其进行优化的假设。内存访问可以在硬件级别缓存,volatile 不会阻止它。这纯粹是一个编译器级别的构造,它不会生成任何特殊的缓存绕过内存访问指令

标签: c multithreading shared-memory


【解决方案1】:

假设所有线程总是将相同的值写入内存 地址(例如,每个线程都执行x = 1000) - 如果一个线程读取 变量在另一个线程正在覆盖的确切时刻 它,是否保证变量具有正确的值?

C 语言规范明确拒绝通过将包含竞争条件的程序的行为声明为未定义来做出这样的保证。而且你说得对,没有同步,你描述的情况是一种竞争条件,尽管写入的值是否相同是内存的初始内容。

或者可以 内存不知何故被随机的东西覆盖了?

行为未定义。原则上,任何事情都可能发生,包括读取时看到从未存储在相关位置的值。

还要注意,比赛不是关于任何客观的同时性。相反,无论是否实际发生任何同时访问,都是由于缺乏同步会阻止同时访问。

在实践中,您可能会发现,在某些实现中,至少在某些情况下,不更改内存内容的写入行为就好像它们不相互冲突,或者与在该值首次出现之后发生的读取不冲突写入该位置,其中“发生在”是一个技术术语,部分取决于同步。但是,我不建议依赖这种行为。即使有记录也不会。

【讨论】:

    【解决方案2】:

    C 标准允许的实现可以廉价地提供比它要求的更强大的保证。因此,该标准竭力避免要求实施维护其成本有时可能超过其收益的任何保证,而将如何以及何时维护其收益将超过成本的保证的问题作为实施质量超出标准的管辖范围。

    虽然保证用它已经包含的值写入对象不会产生任何效果似乎不需要任何成本,但坚持这样的保证有时需要前面一些可能有用的优化。作为一个简单的例子,考虑以下函数

    volatile zz;
    unsigned test(unsigned *p, unsigned *q)
    {
      unsigned temp;
      *p = 0x1234;
      temp = *q;
      zz = 1;
      do {} while(zz);
      *p = 0x1235;
      return temp;
    }
    

    在某些平台上,包括原始的 8088/8086,处理代码的最有效方法可能是将最后一个分配给 *p 替换为 *p += 1;,然后可以使用 inc 指令进行处理。但是,如果代码同时在两个线程中执行,则可能会导致 *p 保留值 0x1236。

    在许多情况下,保证用它已经包含的值写入对象不会花费任何成本,而将涉及此类写入的竞争条件视为良性将消除一些不必要的同步操作的成本。不幸的是,虽然标准允许实现提供超出标准要求的保证,但这样做是实用和有用的,但它没有提供区分提供此类保证的实现与不提供此类保证的实现的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-17
      • 2012-04-17
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多