2009年10月14日 星期三

在C#中使用Mutex

在多執行緒(Multi-Thread)程式中
執行緒之間常常會有相依性,所以需要一些指標
讓搶到指標的人才能存取某個資源或是執行動作
這時候就會需要用到Mutex

Mutex的使用其實非常簡單

/// new a mutex with name
Mutex m = new Mutex(false, "m");
m.WaitOne();

如果要釋放這個資源讓別人使用的時候

m.ReleaseMutex();

不過這邊有很多需要注意的地方
首先,Mutex分為有名字及無名兩種
在自己程式中可以使用無名的Mutex
但是有命名的Mutex會在程式間也有效
所以可以做出讓程式無法重覆啟動的檢查
例如在wpf程式中增加應用程式的建構子(constructor)

/// declare mutex in class to last it until app end
Mutex m = new Mutex(false, "m");
App()
{
/// if the mutex exists, return false in 1 ms
if (!m.WaitOne(1))
{
MessageBox.Show("program is current running!");
Shutdown();
}
}

這時候這支程式就沒辦法重覆啟動了
但是這時候要注意到第二個重點了
因為C#會自動作回收(garbage collection)的動作
如果Mutex是宣告在建構子裡面,那在建構成功後就會被回收了
所以即使沒有釋放(ReleaseMutex)依舊會自動失效
也就是沒辦法阻止重覆啟動

第三個重點就是WaitOne的等待時間了
如果裡面沒有任何的參數,那就是直接等待到有空為止
這有可能會讓程式直接停住
所以最簡單的做法就是增加一個很短的等待時間
並在回傳失敗的地方先做一些處理(比如等待的警告之類的)
之後就放心大膽的等下去~~

另外,如果是有命名的Mutex
那會跟Win32的CreateMutex有相同的效果
也就是兩者使用相同命名的時候也會互相等待

--
參考資料
Threading Tutorial Example 4: Using the Mutex object
Mutex 類別

沒有留言:

張貼留言