如果在C#中检查bool值,那么直接对其求反是否是一种良好的做法/线程安全?

如果在C#中检查bool值,那么直接对其求反是否是一种良好的做法/线程安全?,c#,multithreading,if-statement,conditional-statements,C#,Multithreading,If Statement,Conditional Statements,我问自己是否可以编写一个if语句来检查bool变量,然后在进入语句体之前直接更改其值 因此,与其写作 if(getNextImage) { getNextImage=false; //多做点事 } 我试过这个 if(getNextImage?!(getNextImage=false):false) { //多做点事 } 这起作用了 这样做的原因是代码同时在多个线程中运行,我想确保if块只在代码中到达该行的第一个线程中执行一次 我的问题是:这种方法是一种良好的做法吗?它会按照我的预期工作吗?如

我问自己是否可以编写一个
if
语句来检查bool变量,然后在进入语句体之前直接更改其值

因此,与其写作

if(getNextImage)
{
getNextImage=false;
//多做点事
}
我试过这个

if(getNextImage?!(getNextImage=false):false)
{
//多做点事
}
这起作用了

这样做的原因是代码同时在多个线程中运行,我想确保if块只在代码中到达该行的第一个线程中执行一次


我的问题是:这种方法是一种良好的做法吗?它会按照我的预期工作吗?如果没有,除了锁定之外还有其他方法吗?

我假设您打算更改全局变量的值,如果它满足您的条件。 你会因为你认为的原因而出现问题,这会让很多用户感到困惑。
作为一种解决方案,您可以使用Lock(),也可以创建一个异步方法(),这会更好(锁可能会使应用程序变慢)。

对于线程安全,问题通常归结为避免。不幸的是,在这方面,您的代码没有提供任何保护

正如另一篇帖子所说,lock语句是一种方法。通常,创建对象“互斥体”的唯一目的是锁定

object mutex = new object();

lock (mutex){
  //the code that can not run in parallel
}
在您的案例中,有两个原因:

  • 不能锁定值类型。值类型将被装箱,但每次装箱时都会在不同的实例中装箱。并且lock要求在锁定和解锁期间使用相同的实例
  • 您不想使用返回的实例。因为其他人可能有一个奇妙的想法来锁定它。然后,对锁定调用的任何调用都会导致死锁
  • 因此,这个对象具有这个单一的目的

    当然,在您的情况下,锁定区域可能是在缺乏更好的术语范围内。在读写之后,您不再需要对值进行锁定。毕竟,值本身将成为锁定。所以,也许你应该去看看基本的价值观

    另一种选择是这样的:

    bool LocalGetNextImage = false;
    
    lock(mutex){
      if(GlobalGetNextImage){
         GlobalGetNextImage = false;
         LocalGetNextImage = true;
      }
    }
    

    这将很快释放锁,同时仍然给予线程读取和写入值的独占权限。并且有一个布尔值供以后使用。

    不,它不会按您希望的方式工作
    //多做一些事情
    可能不止一次。通常,对于线程情况,
    锁定
    联锁
    应该是您的解决方案。这两个代码段都不是线程安全的。值可以很容易地从表达式更改到下一个表达式。要么将块包装在锁中,要么在单个原子操作中使用来比较和替换值您想做什么?有更好的方法来协调执行。例如,您可以使用ActionBlock或Channel将工作发布到辅助函数async关键字不会使任何内容异步运行,也不会协调异步操作。它只是一种语法糖,允许await关键字在不阻塞的情况下等待已经运行的异步操作