- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
或不同的标题:
为什么处置获得的 Mutex 会破坏它?
我有以下代码,真正的代码在几个方法之间产生,并在这个方法休眠的地方做事:
bool createdNew;
using (Mutex mutex = new Mutex(true, "Global\\AAA", out createdNew))
{
if (!createdNew)
{
throw new InvalidOperationException();
}
}
Thread.Sleep(15000);
using (Mutex mutex = new Mutex(false, "Global\\AAA", out createdNew))
{
if (!createdNew)
{
mutex.ReleaseMutex();
}
else
{
throw new InvalidOperationException();
}
}
我期待第一次得到 createdNew = true,第二次得到 false,但我两次都得到 true。
它与处理有关,如果我不处理 Mutex
那么一切都会按预期工作,但正如我在几个地方发现的那样 here处理 Mutex
不会释放它(所以我猜它不会破坏它,因为当前线程获取了 Mutex
)。
那么,为什么处理会破坏获得的 Mutex
?
最佳答案
因为互斥锁在最后一个句柄关闭时被销毁(reference):
Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed.
这就是您的示例中发生的情况 - 您创建了互斥量,然后(使用 using
)关闭了它的唯一句柄,因此它被销毁了。
请注意,您不应该像这样创建互斥量并在不释放互斥量的情况下关闭它的句柄:
Mutex mutex = new Mutex(true, "Global\\AAA", out createdNew)
这是说 - 如果互斥量不存在,创建它并赋予该线程所有权。因此,如果 createdNew
在此调用后为真 - 您拥有此互斥锁,因此应该释放它。通过关闭句柄,您要么只是销毁互斥锁(但这是无用的场景),要么放弃互斥锁,以便其他线程\进程等待该互斥锁并抛出 AbandonedMutexException
。所以应该是:
using (Mutex mutex = new Mutex(true, "Global\\AAA", out createdNew)) {
if (!createdNew) {
throw new InvalidOperationException();
}
// do something useful
mutex.ReleaseMutex();
}
第二次使用也不正确:
Mutex mutex = new Mutex(false, "Global\\AAA", out createdNew)
通过将 false
作为您说的第一个参数传递:此互斥量是否已存在 - 不要将其所有权授予此线程。然后你做:
if (!createdNew)
{
mutex.ReleaseMutex();
}
但是此时您无论如何都不能拥有互斥量,因此即使控制流进入此 if
block - 它也不会工作(在 ReleaseMutex
上抛出异常)。相反,您应该显式调用 WaitOne
并忽略 createdNew
的结果(在这种情况下不相关):
using (Mutex mutex = new Mutex(false, "Global\\AAA")) {
if (mutex.WaitOne()) {
// do something useful
mutex.ReleaseMutex();
}
}
关于c# - 如果我在以下代码中重用现有的 Mutex,为什么会得到一个新创建的 Mutex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47570636/
在 C# 及其同类语言中,我们总是使用 public string SomeString { get; set;} 但是你也可以使用(我最近才发现这个,而且是在和编译器闲逛的时候发现的) public
我已经为 Controller 中的函数编写了 Swagger 注释,但在生成 swagger-ui 代码时出现错误。以下是我的注释代码 /*** End of Annotation For dele
我正在 PHP 中开发一项服务,该服务使用 exec 函数调用 jar 文件,如下所示: $text = "string with accents á, ó, ú or العربية"; exec(
我正在尝试了解有关在程序中利用/防止缓冲区溢出的方法的更多信息。我知道如果大小是恒定的,下面的代码很容易受到攻击,但是如果大小每次都是随机的怎么办?是否还有办法从堆栈中获取它并以某种方式动态改变溢出字
对于一项学校作业,我应该制作一个可以以小时、分钟和秒为单位存储时间的时间类。一切正常,但仅声明 get 时属性总是返回 0;并设置; private int seconds, minutes, hou
我正在遍历一些测验对象并将结果存储到json变量中。出现"ReferenceError is not defined"错误,不确定原因。 JS代码 // This function will send
使用 Nifi 的 PutDatabaseRecord 处理器在 MySQL 中插入阿拉伯字符(非拉丁语)时,字符被“??????”替换 插入后,阿拉伯字符串被替换为??????。我已经使用 utf8
谁能告诉我为什么 gets(abc) 使用 char[] 而不是使用 int? int abc; char name[] = "lolrofl"; printf("Hello %s.\n",na
为什么在使用 as.POSIXct 转换下面的时间戳时得到所有 NA? > head(tmp$timestamp_utc) [1] Fri Jul 03 00:15:00 EDT 2015 Fri J
def get_submultiples(n): # Get all submultiples of n if n == 1: return [1] i = 2
有没有办法访问基本模型的实际 child ,意思是:继续使用 django Docs 中的示例,让我们假设我正在建模不同的外卖餐厅,它们只是有共同点 姓名 都有deliver方法 至此: class
我正在寻找一个范围的总和,但我总是得到“未定义”。我相信有些东西出现在错误的位置,但我不确定它是什么。 第 1 部分:“编写一个范围函数,它接受两个参数(start 和 end),并返回一个包含从 s
我已将 spring 版本从 4.2.3 更新到 5.0.2,并将安全性从 5.0.1 更新到 5.0.10 并使用 spring -flex版本1.6.0.RC1。 像这样使用 BlazeDS 依赖
我可以输入但在输出中,我得到的结果为零。我使用两门类(class),一门是主要的,是日志,另一门是成绩计算。在成绩计算器中,我编写了方法和构造函数,在日志中,类通过构造函数调用这些方法。 import
我在使用 go 时遇到了构建问题。我想知道这是编译器中的错误还是代码的问题。 // removed the error handling for sake of clarity file, _ :=
我的角色在与盒子互动时出现问题。我有一个 GameObject Player 附加了一个脚本来与游戏中的盒子交互,脚本是: using UnityEngine; using System.Collec
有谁知道为什么我不能在下面生成百分比 codeIshere (第 97-117 行)? var format=d3.format(".1%"); var percent = format(functi
我正在尝试编写图像识别代码,以针对不同动物图像训练系统,这就是代码。我使用 anaconda 作为解释器,使用pycharm作为环境。 import tensorflow as tf import o
我正在尝试在 Java 中初始化 Matcher,但无论字符串是否已初始化且不为 null,都会继续获取 NPE。 这是代码: pattern.compile("\\s"); System.out.p
所以我有这段代码: ; (function (g) { var d = document, i, am = d.createElement('script'), h = d.head || d.g
我是一名优秀的程序员,十分优秀!