C# 是";b&;=f()&引用;线程安全如果";f();线程安全吗?
给定一个布尔值b和一个返回布尔值的线程安全函数f(),下一个语句是线程安全的:C# 是";b&;=f()&引用;线程安全如果";f();线程安全吗?,c#,.net,thread-safety,C#,.net,Thread Safety,给定一个布尔值b和一个返回布尔值的线程安全函数f(),下一个语句是线程安全的: b &= f(); 其思想是多个线程并行执行此语句。如果其中一个f返回false,那么b应该是false。否则b为真 我猜它不是原子的,可能会发生这样的情况:一个线程读取b,冻结,同时第二个线程读取b,运行f(),应用&,然后第一个线程唤醒,运行f()并使用旧的b应用& 保证给定的线程首先运行f(),然后读取b,然后应用& No;无法保证您会得到正确的结果: 第一个线程读取b(这是true) 第二个线程读取
b &= f();
其思想是多个线程并行执行此语句。如果其中一个f返回false,那么b应该是false。否则b为真
我猜它不是原子的,可能会发生这样的情况:一个线程读取b,冻结,同时第二个线程读取b,运行f(),应用&,然后第一个线程唤醒,运行f()并使用旧的b应用&
保证给定的线程首先运行f(),然后读取b,然后应用& No;无法保证您会得到正确的结果:
b
(这是true
)b
(这是true
)b&f()
b&f()
b
写回(b
为false
)b
写回(最后,b
是true
)原因是,需要获得b的值。如果线程A保存该值并被线程b中断(线程b获取b并执行f),则第一个线程的执行将在错误的值上工作。如果多个线程正在修改
b
,则需要同步访问。&
并不特殊。a=某事(a)总是很活泼。这里,某物(a)=>a&f()。