给定一个布尔值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
)
第二个线程写回b
(b
是false
)
第一个线程写回b
(最后,b
是true
)
所以你必须同步访问
关于c# - 如果“f()”是线程安全的,则“b&= f();”是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39292080/