Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是";b&;=f()&引用;线程安全如果";f();线程安全吗?_C#_.net_Thread Safety - Fatal编程技术网

C# 是";b&;=f()&引用;线程安全如果";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(),下一个语句是线程安全的:

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()。