【问题标题】:Different LinqPad tabs acquires the same mutex?不同的 LinqPad 选项卡获取相同的互斥锁?
【发布时间】: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


【解决方案1】:

GC 正在收集您的 Mutex,因此第一个程序在第二个程序启动之前将其关闭。

ReadLine 之后添加GC.KeepAlive(mtx) 以强制Mutex 在此之前继续存在。

【讨论】:

  • (我的第一个回答是误会)
  • 解决问题的不是GC.KeepAlive(mtx),因为没有找到代码。就是在代码中引用了mtx,加上var type = mtx.GetType();也是一样的效果。所以基本上,它是编译器优化。
  • @Yona:这就是KeepAlive 所做的。这是一个无操作方法,它只是强制它的调用者使用一个变量。 msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx
  • 但是KeepAlive 没有被执行,因为Util.ReadLine() 在到达该行之前阻止了执行。
  • @Yona: KeepAlive 的意义在于向 GC/JITter 显示该变量稍后使用。阅读文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2011-07-24
  • 2018-06-20
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多