是“b& = f();”线程安全如果“f()”是线程安全的吗?

时间:2016-09-02 12:09:10

标签: c# .net thread-safety

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

b &= f();

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

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

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

2 个答案:

答案 0 :(得分:4)

没有;我们无法保证您能得到正确的结果:

  1. 第一个帖子是btrue
  2. 第二个帖子读取btrue
  3. 第一个线程执行b & f()(并找到它true
  4. 第二个线程执行b & f()(并找到它false
  5. 第二个帖子写回bbfalse
  6. 第一个帖子写回b(最后,btrue
  7. 因此您必须同步访问权限

答案 1 :(得分:1)

简单的答案是:不。 原因是需要获得b的值。如果线程A保存该值并被线程b中断,后者获取b并执行f,那么第一个线程的执行将在错误的值上运行。