2014-10-19 73 views
0

我有方法的()中项目乙项目甲互斥C#。如何系统识别互斥码

和方法B()

我需要两个方法在互斥

目前我的代码如下

在项目中

Mutex mutex = new Mutex(fale,"MT"); 
mutex.WaitOne(); 
//SOME LENGTHY CODE 
mutex.ReleaseMutex(); 
在该凸出

ect B我有

Mutex mutex = new Mutex(fale,"MT"); 
mutex.WaitOne(); 
//some different lengthy code 
mutex.ReleaseMutex(); 

我可以看到他的功能作品互相排斥预期。

现在我这里有

一个 2个问题:我在这两种方法使用的名字命名为“MT”。 这就是为什么这2个代码变得相互排斥的原因。

即使我使用不同的名字,这两个代码是否相互排斥,是否有任何不同的方式?

两个:假设项目A上的代码放在一个无限循环 我如何在b启动方法(如何避免死锁)

+1

1.第2名。这是一只fa鱼。当然,你不能期望合理的行为不合理的代码。你可以检测到它,WaitOne()有一个超时,超时。 – 2014-10-19 15:18:55

+1

建议您在前缀“Global \”或“Local \”中明确添加您的互斥体名称,以清楚您的互斥体是否具有[会话或计算机范围](http://msdn.microsoft.com/en-us/库/ system.threading.mutex(v = vs.110)的.aspx)。 – StuartLC 2014-10-19 15:24:47

回答

1

方式Mutex工作是有两个proceeses?请求所有权对象相同对象,以便第一个获取它,第二个必须等到第一个释放它。该名称是系统用来确定它们是否是“相同”的,因此使用不同的名称将允许同时访问两者(因为每个人都请求其自己的Mutex的所有权,其他人没有声明) 。

关于第二个问题,无限循环并不完全是死锁,我认为它不仅仅是第一个进程中的一个错误。即使在一个简单的程序中,这样的事情也是一个错误,程序会崩溃。超时可能会解决这个问题,但如果存在共享资源(这就是为什么您首先使用它互斥访问的原因),则可能会产生另一个问题。我会采取预防措施,首先避免此类错误,或者如果它可以合法发生,请尽早释放Mutex。