为什么你应该关心在崩溃/异常的情况下不被释放的NAMED互斥锁?

时间:2017-08-16 06:16:58

标签: c# .net multithreading mutex

[TestClass]
public class TestMutex{
   private Mutex myMutex = new Mutex(true, "MyMutex");

   [TestInitialize]
   public void Setup(){
      myMutex.WaitOne(TimeSpan.FromSeconds(2));
   }
   [TestCleanup]
   public void Cleanup()
   {
     myMutex.ReleaseMutex();
   }

   [TestMethod]
   public void Test_Mutex1(){
     [...do something...] }

   [TestMethod]
   public void Test_Mutex2(){
     [...do something else...] }

这段代码的作用是创建一个名为“MyMutex”的互斥锁,并在每个方法之前对其进行查询,并在完成后释放它。

现在,如果Mutex被Test_Mutex1()占用并且此方法导致异常或崩溃,则它永远不会被释放,因为在发生异常时不会调用TestCleanup。

Test_Mutex2()将永远不会运行,因为wait句柄返回false,因为Test_Mutex1()没有释放互斥锁。

=>这是否影响除Test_Mutex2()之外的其他任何内容?

=>其他TestClasses的方法是否有副作用?

=> 为什么我要关心释放互斥锁,除了我想让Test_Mutex2()运行?它是一个NAMED互斥锁,因此任何代码的任何其他部分都不可能阻止某些东西因为它没有明确命名 - 我做对了吗?

=>是否可能(一般情况下)上述方法可能存在任何类型的死锁?我没想过,因为它被命名,任何其他过程都不应该关心这个。

0 个答案:

没有答案