【发布时间】:2011-02-08 17:43:51
【问题描述】:
我正在测试一些线程代码,并使用 LinqPad 我注意到我能够从两个不同的 LinqPad 选项卡中获取同名的 Mutex。在为我诊断之后,我意识到它只发生在 LinqPad 中而不是常规代码中。
任何帮助为什么会发生? AFAIK LinqPad 使用不同的应用程序域来执行每个选项卡,但我不确定这应该如何改变任何东西,因为我使用的是命名互斥体。
代码如下:
var mutexName = @"Global\TestMutex".Dump();
var createdNew = false;
var mtx = new Mutex(true, mutexName, out createdNew);
(createdNew ? "I own the mutex" : "I don't own the mutex").Dump();
mtx.WaitOne(); // Not really necessary
"I aquired the mutex".Dump();
string.Format("PID: {0} ThreadID: {1} AppDomainID: {2}",
Process.GetCurrentProcess().Id,
AppDomain.GetCurrentThreadId(),
AppDomain.CurrentDomain.Id).Dump();
Util.ReadLine();
将此代码粘贴到两个 LinqPad 选项卡中,它会不断重现问题,但有时您必须停止并启动第二个选项卡。
【问题讨论】:
-
你检查过选项吗?里面有一些与回收应用域相关的设置。
-
我不知道这些选项,但我只是检查了它们,应该不会影响结果。除了两个选项卡同时运行并且无论 Thread 或 AppDomain 是什么之外,它们不应该能够一次获取相同命名的 Mutex
-
既然 Joe Albahari(LinqPad 的作者)也写过一本关于线程的书,我相信他能解释一下。
标签: c# .net multithreading mutex linqpad