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

b &= f();


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

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

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

最佳答案

没有;无法保证您将获得正确的结果:


第一个线程读取b(即true
第二个线程读取b(即true
第一个线程执行b & f()(并找到它true
第二个线程执行b & f()(并找到它false
第二个线程写回bbfalse
第一个线程写回b(最后,btrue


所以你必须同步访问

关于c# - 如果“f()”是线程安全的,则“b&= f();”是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39292080/

10-17 02:13