b &= f();"线程安全的if "f()"是线程安全的

本文关键字:quot 线程 安全 if | 更新日期: 2023-09-27 18:05:15

给定一个布尔值b和一个返回布尔值的线程安全函数f(),下一个语句是线程安全的吗?

b &= f();

这个想法是几个线程并行执行这个语句。如果其中一个返回false,则b应该为false。否则b为真。

我猜不是原子的,它可能发生一个线程读取b,冻结,同时第二个线程读取b,运行f(),应用&,然后第一个线程唤醒,运行f(),并应用&使用旧的b.

保证给定线程首先运行f(),然后读取b,然后应用&?

b &= f();"线程安全的if "f()"是线程安全的

不;不能保证您将得到正确的结果:

    第一个线程读取b(即true)
  1. 第二个线程读取b(即true)
  2. 第一个线程执行b & f()(并找到true)
  3. 第二个线程执行b & f()(并找到false)
  4. 第二个线程回写b (bfalse)
  5. 第一个线程回写b(最后,btrue)
所以你必须同步访问

答案很简单:没有。这样做的原因是,需要得到b的值。如果线程A保存了该值并被线程b中断,而线程b获取b并执行f,那么第一个线程的执行将处理一个错误的值。