2012-08-09 78 views
0

如果我做的:無法同步兩個線程

ConsoleApp1:

bool mutexCreated; 
    var mutex = new Mutex(true, "MemoryMappedFileMutex", out mutexCreated); 

    Console.Write("Run Console App2 then press enter"); 
    Console.Read(); 

    // do work 
    Thread.Sleep(5000); 

    mutex.ReleaseMutex(); // makes console app 2 to stop waiting 

ConsoleApp2

var mutex = Mutex.OpenExisting("MemoryMappedFileMutex"); 

    mutex.WaitOne(); 

    // continue executing once console app 1 releases mutex 

一切都很正常。我必須先啓動consoleApp1,然後才能使用此算法。

現在我的問題是我會喜歡consoleApp2充當服務器。因此,我希望首先啓動該應用程序。問題是,如果我這樣做:

bool mutexCreated; 
    var mutex = new Mutex(true, "MemoryMappedFileMutex", out mutexCreated); 

    mutex.WaitOne(); // <------ mutex will not wait why???? 

如果我這樣做mutex.WaitOne()線程不會等待。換句話說,我想首先啓動consoleApp2並讓該應用程序等待,直到我以某種方式在控制檯應用程序1上發出互斥信號。......

+0

不要調用你的互斥鎖「MemoryMappedFileMutex」。互斥體名稱是全球性的。您冒着與使用該通用名稱的其他程序相沖突的風險。 – usr 2012-08-09 21:34:49

回答

1

在您的服務器應用程序中,嘗試使用false作爲第一個參數調用構造函數,以便調用線程最初不會擁有互斥鎖。

1

等待來自擁有線程的互斥體不會阻塞,並且您指定true作爲第一個互斥體構造函數arg,這表明它已被創建爲當前線程所擁有。