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
(即true
) - 第一个线程执行
b & f()
(并找到true
) - 第二个线程执行
b & f()
(并找到false
) - 第二个线程回写
b
(b
是false
) - 第一个线程回写
b
(最后,b
是true
)
b
(即true
)答案很简单:没有。这样做的原因是,需要得到b的值。如果线程A保存了该值并被线程b中断,而线程b获取b并执行f,那么第一个线程的执行将处理一个错误的值。