首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放互斥锁。

释放互斥锁。
EN

Stack Overflow用户
提问于 2012-05-02 03:14:44
回答 2查看 583关注 0票数 1

“Mutex类强制线程标识,因此互斥锁只能由获得它的线程释放。相比之下,Semaphore类不强制线程标识。”

这就是MSDN描述所说的..但是根据我的问题Application exception is thrown,我试图释放一个互斥锁,即使我没有得到它。它在执行下一个线程时向我显示了一个异常。这是否意味着不能访问互斥锁的线程释放了它?有没有人可以帮我理解这个概念,如果我做错了什么,请指点我。

EN

回答 2

Stack Overflow用户

发布于 2012-05-02 03:43:28

正如文档所说,抛出ApplicationException是因为不拥有互斥锁的线程试图释放它。这并不意味着互斥锁被释放了,只是试图释放它的线程并不拥有它。

代码语言:javascript
复制
var mutex = new Mutex();
mutex.WaitOne();
var thread = new Thread(() =>
    {
       try
       {
          mutex.ReleaseMutex(); //This will throw ApplicationException
       }
       catch (ApplicationException ex)
       {
           Console.WriteLine("Failed to release mutex");
       }
    });

thread.Start();
thread.Join();

mutex.ReleaseMutex(); //No exception will be thrown here

在本例中,初始线程创建互斥锁并获取它。第二个线程将被旋转,试图释放它,但失败了。在它失败后,拥有它的线程将释放它。

更新

在前面的问题中,重要的是要注意,您正在使用多个线程运行该代码,并且每个线程中都存在相同的争用条件。当一个线程持有互斥量时,多个线程可能无法获取互斥量,因此多个线程也同样无法释放互斥量。以下面的执行路径为例。

  • 线程1获取互斥锁。
  • 线程2无法获取互斥体,因为线程1具有该互斥体。
  • 线程3无法获取互斥锁,因为线程1具有该互斥锁。
  • Thread3试图释放互斥锁,抛出一个ApplicationException,因为它不拥有它。
  • 线程1释放互斥锁。
  • 线程2试图释放互斥锁,抛出一个ApplicationException,因为它不拥有它。

Thread 3在未能释放互斥锁时爆炸的事实与Thread 2也因同样的事情而爆炸的事实无关。

票数 1
EN

Stack Overflow用户

发布于 2012-05-02 03:58:59

考虑到互斥锁的概念,你可以把它想象成一个抽屉,拥有互斥锁的线程就是持有这个抽屉钥匙的人。只有持有抽屉钥匙的人才能解锁它,因此只有获得互斥锁的线程才能释放它。

当你试图从一个不拥有互斥锁的线程中释放互斥锁时,就像有人试图用假钥匙打开别人的抽屉一样,所以会抛出一个异常来抓住窃贼!

这就是互斥锁所做的一切,它阻止多个线程执行“受保护的代码”(在抽屉中)。它的名字来源于“互斥”,意思是一次只有一个线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10402934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档