为什么 Mutex 被释放后没有被释放?

2024-01-16

我有以下代码:

using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
    if (mut.WaitOne(new TimeSpan(0, 0, 30)))
    {
       // Some code that deals with a specific TCP port
       // Don't want this to run at the same time in another process
    }
}

我已经在里面设置了一个断点if块,并在 Visual Studio 的另一个实例中运行相同的代码。正如预期的那样,.WaitOne调用块。然而,令我惊讶的是,当我continue在第一个例子中和using块终止时,我在第二个进程中收到有关废弃互斥体的异常。

修复方法是调用ReleaseMutex:

using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
    if (mut.WaitOne(new TimeSpan(0, 0, 30)))
    {
       // Some code that deals with a specific TCP port
       // Don't want this to run twice in multiple processes
    }

    mut.ReleaseMutex();
}

现在,一切都按预期进行。

我的问题:通常一个点IDisposable is it 清理无论你把东西放在什么状态。我可以看到也许有多个waits and releases在一个using块,但是当互斥体的句柄被释放时,它不应该自动释放吗?换句话说,为什么我需要打电话ReleaseMutex如果我在using block?

我现在还担心如果代码中if块崩溃,我会放弃周围的互斥体。

放置有什么好处吗Mutex in a using堵塞?或者,我应该只是new up a Mutex实例,将其包装在 try/catch 中,然后调用ReleaseMutex()finally块(基本上完全实现了我的thought Dispose()会做)


文档 http://msdn.microsoft.com/en-us/library/f55ddskf(v=vs.110).aspx解释(在“备注”部分)两者之间存在概念差异实例化一个 Mutex 对象(它的作用是not,事实上,就同步而言,做任何特别的事情)并且获取互斥体(使用WaitOne http://msdn.microsoft.com/en-us/library/cc190477(v=vs.110).aspx)。注意:

  • WaitOne返回一个布尔值,这意味着获取互斥体可以fail(超时)两种情况都必须处理
  • When WaitOne回报true,则调用线程已获取互斥体并且must call ReleaseMutex,否则互斥体将被废弃
  • 当它返回时false,然后是调用线程must not call ReleaseMutex

因此,互斥锁不仅仅是实例化。至于是否应该使用using无论如何,让我们看看是什么Dispose确实(如继承自WaitHandle http://msdn.microsoft.com/en-us/library/System.Threading.WaitHandle(v=vs.110).aspx):

protected virtual void Dispose(bool explicitDisposing)
{
    if (this.safeWaitHandle != null)
    {
        this.safeWaitHandle.Close();
    }
}

正如我们所看到的,互斥锁是not已发布,但涉及一些清理工作,所以坚持使用using将是一个很好的方法。

至于你应该如何进行,你当然可以使用try/finally块以确保在获取互斥体时能够正确释放它。这可能是最直接的方法。

If you really不关心互斥体无法获取的情况(您没有指出,因为您传递了一个TimeSpan to WaitOne),你可以换行Mutex在你自己的类中实现IDisposable,在构造函数中获取互斥体(使用WaitOne()不带任何参数),然后在内部释放它Dispose。虽然,我可能不会推荐这样做,因为如果出现问题,这会导致您的线程无限期地等待,并且无论有充分的理由 https://stackoverflow.com/a/25433661/716118用于在尝试获取时显式处理这两种情况,如@HansPassant所述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Mutex 被释放后没有被释放? 的相关文章

  • C 中的复合语句表达式

    下面的代码不起作用 int i void 999 100 添加括号就可以了 为什么 int i void 999 100 还有另一种方法可以完成此类分配 int i void 999 100 是什么让他们与众不同 在这份声明中 int i
  • 在桌面应用程序中,类库的连接字符串存储在哪里?我可以在app.config中使用吗?

    我是桌面应用程序开发的新手 目前正在使用分层架构 用户界面 DAL BLL 构建桌面应用程序 在 Web 开发中 我曾经将连接字符串存储在 web config 中 我的类库从那里访问它 请指导我在桌面应用程序中如何以及在何处存储 DAL
  • 使用静态类型代替变量

    当您的项目不使用命名空间时 有什么方法可以告诉编译器使用静态类型而不是变量吗 例如 我有一个名为 User 的类 它具有各种静态和非静态方法 假设调用了其中一个静态方法GetUser 我想称之为User GetUser 方法来自一个方法 该
  • 将列表(对象)转换为列表(字符串)

    有没有办法转换List of Object to a List of String 在 c 或 vb net 中而不迭代所有项目 幕后迭代很好 我只想要简洁的代码 Update 最好的方法可能就是进行新的选择 myList Select f
  • Entity Framework 4.1 RC:Code First EntityTypeConfiguration 继承问题

    我尝试使用通用的 EntityTypeConfiguration 类来配置所有实体的主键 以便每个派生的配置类不会重复自身 我的所有实体都实现一个公共接口 IEntity 它表示每个实体必须有一个 int 类型的 Id 属性 我的配置基类如
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • 控制器中的异常处理 (ASP.NET MVC)

    当您自己的代码抛出异常并从控制器中的操作调用时 应该如何处理 我看到很多最佳实践的例子 其中根本没有 try catch 语句 例如 从存储库访问数据 public ViewResult Index IList
  • 枚举器上的 [[maybe_unused]]

    查看规格 maybe unused http en cppreference com w cpp language attributes 它指出 出现在类 typedef 变量 非静态数据成员 函数 枚举或枚举器的声明中 如果编译器对未使用
  • 在不使用 Thread.Sleep c# 的情况下延迟发送电子邮件

    我有一个 for 循环 它循环并每个循环发送一封电子邮件 现在我正在使用 thread sleep 但我希望用户仍然能够与程序交互 只需取消该循环即可 是否可以在不使用 thread sleep 的情况下做到这一点 您是否在 UI 线程上运
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • 如何让实体框架初始化新创建的实体上的集合?

    我正在尝试用一些测试数据来种子我的数据库IDatabaseIntialiser像这样 protected override void Seed BlogDataContext context
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • .Net 中是否有一个框架属性可以隐藏成员以使其免受反射?

    是否有一个属性可以隐藏成员 特别是属性 typeof MyType GetProperties 在 net中 我正在寻找快速修复方法 即不创建自定义属性等 thanks No 反射允许人们看到一切 包括标记为私有的成员 最终反射使用与 CL
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 需要使用 openssl 加密和解密文件的示例 C 代码

    我正在用 Linux C 编写代码 我需要使用以下命令来加密和解密文件 openssl 目前 我使用系统命令 des3 e nosalt k 0123456789012345 in inp file out out file 进行加密 使用
  • 如何使用简历实现一个“一网打尽”的异常处理程序?

    我想知道我怎样才能写一个抓住他们全部应用程序级别的异常处理程序将为用户提供恢复应用程序流程的选项 如果您正在运行 Windows 窗体应用程序 将处理程序添加到Application ThreadException event
  • 使用 roslyn 扩展 C# 语法

    我试图在没有 else 情况的情况下实现 return if return value if 因为我只想在条件有效时返回或返回一个值 我知道 有if condition return or if condition return value

随机推荐

  • 出现分段错误

    我看到很多关于出现分段错误在SO中的C程序中 我认为参考这里的内容会很棒 这是一个涉及某些导致分段错误的情况的问题 我的答案发布在下面 正如一些答案中所写 所有情况下的行为都是未定义的 尽管很多人都将他们视为分段故障 所以这个问题是关于是什
  • 如何有条件地使用“平面图”运算符? (角度2/rxjs)

    我想要实现的是有条件地运行一系列可观察的结果 return observable map response gt response flatmap response1 gt observable1 response1 flatmap res
  • 找不到符号 if 语句错误

    我一直在编写一个小程序来娱乐 但我收到了这个错误 Compilation error time 0 11 memory 380672 signal 0Main java 22 error cannot find symbol string
  • 从列表中选择 5 个不同的元素?

    从 python 列表中选择 5 个不同元素并将它们添加到新列表中的最佳方法是什么 谢谢您的帮助 假设您希望随机选择它们并且new list已经定义了 import random new list random sample old lis
  • 如何实现隐式方法的中间类型?

    假设我想提供方法foo在现有类型上A在我的控制之外 据我所知 在 Scala 中执行此操作的规范方法是实现从A到某种实现的类型foo 现在我基本上看到两个选择 为此目的定义一个单独的 甚至可能是隐藏的类 protected class Fo
  • 当用户拒绝地理定位服务时,我会收到拒绝事件吗?

    我的意思是 如果我在网页上有一个按钮 当用户单击该按钮时 然后就可以获取用户的地理位置信息 但在此之前 浏览器会询问用户是否接受使用地理定位服务 如果用户拒绝地理定位服务 我可以获得拒绝事件吗 Yes Example navigator g
  • 如何通过nodejs实现APNS通知?

    现在有人有一个很好的 npm 模块来实现 Apple PUSH 通知吗 一个简单的例子就很好了 我找到的解决方案如下 它使用apn module var apn require apn var ca entrust 2048 ca cer
  • 将一个函数中的可变参数传递给 D 中的另一个函数

    我有一个可变的 D 风格函数foo format 这是一个包装器writefln 我想做这样的事情 foo format lt gt writefln format 本质上 将省略号参数传递给 writefln 我知道这在 C C 中并不容
  • 在 Android KitKat 中接收彩信

    所以这个视频Android 4 4 短信 API http www youtube com watch v mdq0R2WQssQ DevBytes 解释了 KitKat 中 SMS API 的最新变化 他们还提供了示例项目的链接 http
  • NSURLConnection sendAsynchronousRequest:queue:completionHandler:连续发出多个请求?

    我一直在使用NSURLConnection s sendAsynchronousRequest queue completionHandler 方法很棒 但是 我现在需要连续发出多个请求 我怎样才能在仍然使用这个伟大的异步方法的同时做到这一
  • 将整型转换为枚举:函数式转换与初始化

    假设有一个这样的枚举 enum foo int first second 然后我按如下方式使用它 foo f 1 error cannot initialize a variable of type foo with an rvalue o
  • 在不同主机上预编译具有相同摘要的资产

    是否可以使用相同的摘要在不同主机 流量路由 上编译资产 例如 如果我的 Rails 3 2 应用程序部署到 2 个不同的主机 host1 和 host2 我想要application css在具有相同摘要的主机 1 和主机 2 上appli
  • 使用 RaptureXML 行计数返回错误的数字

    我目前正在使用 Rapture XML 从 url 中提取数据以显示在表视图中 我已经设法获取我需要的每个字符串并将其添加到我的数组中 如下所示 void loadURL RXMLElement rootXML RXMLElement el
  • 网络调用永不超时

    我有许多使用各种 Web 技术的应用程序 例如 SOAP WCF 服务或简单的 XmlReader 然而 如果互联网连接在错误的时间出现问题 它们似乎都会遇到同样的问题 即错过超时并无限挂起 我已将所有场景中的超时设置为较小的值 例如对于W
  • Gzip 压缩在我的 Spring boot 1.5.10.RELEASE 项目中不起作用

    我正在使用 Spring Boot 1 5 10 RELEASE 版本 Gzip 压缩不起作用 http localhost 9000 gt http localhost 8080 api Angularjs 和 REST API 位于不同
  • 如何查找/替换 xml 文件中的多个字符串?

    我有大约 600 个不同的文本字符串需要在 XML 文件中替换 我正在使用 notepad 但如果这可以完成任务 我也可以使用其他程序 文本更改列在单独的 Excel 文件中 有没有一种方法可以运行脚本或命令来一次查找 替换所有字符串 而不
  • 调用两个 javascript 函数 onClick

    目前我的网页之一上有以下代码 a href http ex com Grab Coupon a 现在我想再运行一个脚本 其使用方式如下 onClick recordOutboundLink this Outbound Links ex co
  • 使用 org.json lib 将 Java 对象转换为 JSON

    我有这样的课程 public class Class1 private String result private String ip private ArrayList
  • Watir 浏览器进程无法正常启动 (Windows)

    我已经在 Linux 中构建了一个简单的脚本 但现在我试图让它在 Windows 上运行 代码是 require watir webdriver puts Press enter when ready to continue gets br
  • 为什么 Mutex 被释放后没有被释放?

    我有以下代码 using Mutex mut new Mutex false MUTEX NAME if mut WaitOne new TimeSpan 0 0 30 Some code that deals with a specifi