2011-02-08 7 views
0

私はいくつかのスレッディングコードをテストしており、LinqPadを使用して、2つの異なるLinqPadタブから同じ名前のMutexを取得できることに気付きました。私はLinqPadでのみ発生し、通常のコードではないことがわかっている間私は診断した後。異なるLinqPadタブが同じミューテックスを取得しますか?

何が起こるのか? AFAIK LinqPadは、各タブを実行するために異なるApp Domainsを使用しますが、名前付きのmutexを使用しているので、どのように変更する必要があるかわかりません。

は、ここでは、コードです:時々あなたがが2番目のタブを停止して起動する必要があるだろう、

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(); 

は2つのLinqPadタブにこのコードを貼り付け、それが一貫して問題を再現します。

+0

オプションを確認しましたか?そこにアプリドメインをリサイクルするための設定がいくつかあります。 –

+0

私はそれらのオプションを認識していませんでしたが、私はそれらをチェックしただけで結果には影響しません。両方のタブが同時に実行され、スレッドまたはAppDomainに関係なく、同じ名前のMutexを一度に取得できないようにする必要があります。 – Yona

+0

Joe Albahari(LinqPadの著者)もスレッディングに関する書籍を書いているので、それを説明することができるでしょう。 – sgmoore

答えて

2

あなたのミューテックスはGCによって収集されているので、最初のプログラムは2番目のプログラムが開始する前に閉じます。

ReadLineの後にGC.KeepAlive(mtx)を追加すると、それまでミューテックスが生き残るように強制されます。

+0

(私の最初の答えは誤解でした) – SLaks

+0

コードに達していないので、問題を解決するのはGC.KeepAlive(mtx)ではありません。 'mtx'はコード内で参照され、' var type = mtx.GetType(); 'と同じ効果があります。基本的にコンパイラの最適化です。 – Yona

+1

@Yona:これがKeepAliveの動作です。これは呼び出し元に変数を使用させるだけの操作ではありません。 http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx – SLaks

関連する問題