给定一个布尔值b和一个返回布尔值的线程安全函数f(),下一个语句是线程安全的:
b &= f();
这个想法是几个线程并行执行这个语句。如果其中一个f返回false,则b应为false。否则b是真的。
我猜不是原子的,可能会发生一个线程读取b,冻结,同时第二个线程读取b,运行f(),应用&amp ;,然后第一个线程唤醒,运行f()并应用&用旧b。
保证给定的线程,首先运行f()然后读取b然后应用&?
答案 0 :(得分:4)
没有;我们无法保证您能得到正确的结果:
b
(true
)b
(true
)b & f()
(并找到它true
)b & f()
(并找到它false
)b
(b
是false
)b
(最后,b
是true
)因此您必须同步访问权限
答案 1 :(得分:1)
简单的答案是:不。 原因是需要获得b的值。如果线程A保存该值并被线程b中断,后者获取b并执行f,那么第一个线程的执行将在错误的值上运行。