Code Bye

问个多线程Mutex类怎么样最终释放的问题

问题是:怎么样在console 窗口程序被强行关闭时,仍然能够释放mutex对象?
来源如下:
正在学习多线程,关于Mutex的示例很简单,程序如下
static void Main(string[] args)
{
const string MutexName = “CSharpThreadingCookBook”;
using (var m = new Mutex(false, MutexName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(10), false))
{
Console.WriteLine(“Second instance is running”);
Console.ReadLine();
}
else
{
Console.WriteLine(“Running”);
Console.ReadLine();
m.ReleaseMutex();
}
}
效果就是,假如运行一个实例,会显示running,这时候再运行第二个实例,开始就什么也不显示了 –》
假如在第二个实例开始运行10秒内,在第一个实例内敲下回车,第二个实例就显示running,假如过了10秒,就会出现second instance is ruuning字样了。

问题在于:假如不是在第一个实例内敲下回车,而是直接点叉来关闭console 窗口,就会在第二个实例内跳出一个异常来。本人稍微改了改,捕捉这个异常:
try
{
if (!m.WaitOne(TimeSpan.FromSeconds(10), false))
{
Console.WriteLine(“Second instance is running”);
Console.ReadLine();
}
else
{
Console.WriteLine(“Running”);
Console.ReadLine();
m.ReleaseMutex();
}
}
catch (Exception e)
{
if (e is AbandonedMutexException)
Console.WriteLine(e.Message);
else
Console.WriteLine(“not spot type”);
Console.ReadLine();
}
这样就好了,不会异常退出,而是捕捉到之后进行处理。可是本人还是想问一句:

怎么样做才能保证在console 窗口被点叉关闭时,也能正常release这个mutex?谢谢
解决方案

10

你吧概念给看歪了。这不是多线程,这是多进程,因此基本上不用这个东西。
假如用,偶尔一些开源系统会使用(例如一个字节的)文件为共享控制,而不是用这个方式。

10

引用 3 楼 neotsu 的回复:

恩,这个是笔误,原因是其他都是线程内的问题,所以顺手写错了。
那么怎么避免这个异常呢?就是说怎么能在进程意外关闭时,将其释放呢?本人试过finally,但是试之前也知道这个不靠谱,果然也不工作。

为什么要避免这个异常呢?你的处理AbandonedMutexException方式是对的。AbandonedMutexException就是操作系统帮你解决Mutex释放的方式。
意外关闭/程序崩溃等情况下,程序是不一定有机会运行清理过程的。
这种情况下,操作系统负责清理资源是很有意义的。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明问个多线程Mutex类怎么样最终释放的问题