使用 Mutex Class 的临界区内 method/global 变量的行为

The behavior of method/global variables inside a critical section using Mutex Class

我正在读一本关于 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;
    }
}

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

感谢您的宝贵时间:)

这是我尝试 post 根据您的补充评论和您表示您认为我的评论之一有帮助的回答。

假设您正在查看的代码与此有些相似:

   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;
      }
   }

那么 Balanceresult 之间的根本区别在于 Balanceclass 实例变量,class BankAccount 的每个实例都有一个它的实例。同时,result 是一个 local 变量 所以每个存在的 result 都有一个实例(通常为零) 调用 BankTransferWithMutex() 方法。

因此,如果有一个 BankAccount 对象的实例,并且由 10 个线程共享,那么这 10 个线程将共享 Balance 的一个实例。 result 变量与 BankTransferWithMutex() 方法的调用相关联,因此每次调用都有一个 - 通常为零,但最多可达 10。

这是一个 MSDN link,尽管它需要点击一堆子主题才能看到整个内容:https://msdn.microsoft.com/en-us/library/aa691160%28v=vs.71%29.aspx