使用 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;
}
}
那么 Balance 和 result 之间的根本区别在于 Balance 是 class 实例变量,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
我正在读一本关于 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;
}
}
那么 Balance 和 result 之间的根本区别在于 Balance 是 class 实例变量,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