使用Mutex类在关键部分内的方法/全局变量的行为

时间:2015-01-31 15:31:16

标签: c# .net mutex mutual-exclusion

我正在读一本关于C#的书,我知道关键部分的用途是什么,但是这个例子出现在书上并且让我困惑:

public bool BankTransferWithMutex(int amount)
{
    bool result = false;

    MyMutex.WaitOne();

    if (Balance >= amount)
    {
        Balance -= amount;
        result = true;
    }

    MyMutex.ReleaseMutex();
    //My question is here..
    return result;
    }
}

我的问题是这个,想象有两个线程,其中一个获得了对互斥锁的访问,并且银行转移成功将结果变量设置为true ..如果另一个线程出现(在第一个执行返回之前)输入这个方法,它会立即放置result = false。第一个线程是否会修改结果变量,因此尽管银行转账成功,它会返回false?使对象状态不一致?

感谢您的时间:)

1 个答案:

答案 0 :(得分:1)

我尝试根据您的其他评论以及您认为我认为其中一条评论有用的说明发布答案。

假设您正在查看的代码与此类似:

   public class BankAccount
   {
      private int Balance;

      private Mutex MyMutex = new Mutex();


      public bool BankTransferWithMutex(int amount)
      {
         bool result = false;

         MyMutex.WaitOne();

         if (Balance >= amount)
         {
            Balance -= amount;
            result = true;
         }

         MyMutex.ReleaseMutex();
         //My question is here..
         return result;
      }
   }

那么 Balance 结果之间的根本区别在于 Balance 类实例变量,并且那里是BankAccount类的每个实例的一个实例。同时,结果局部变量,因此对于BankTransferWithMutex()方法的每个现有(通常为零)调用,都有一个结果实例。

因此,如果有一个BankAccount对象的实例,并且它由10个线程共享,则10个线程共享 Balance 的一个实例。 结果变量与BankTransferWithMutex()方法的调用相关联,因此每个当前调用都有一个 - 通常为零,但最多可以为10。

这是一个MSDN链接,虽然它需要点击一堆子主题来查看整个内容:https://msdn.microsoft.com/en-us/library/aa691160%28v=vs.71%29.aspx