2011-10-17 70 views
3

我已閱讀mutex被線程所有並且只能由擁有線程使用。在this answer中,解決方案建議每個進程在發出信號通知其他對象之前必須擁有該互斥鎖的所有權。我必須在這裏承認我的愚蠢,我不知道如何使用IPC的事件,因爲他們還沒有在我的MSDN閱讀中彈出,我喜歡這個唯一命名的mutex作爲我的解決方案,但我甚至不知道如何在WindowsService和常規進程之間轉移所有權。請幫忙。轉移.NET互斥鎖的所有權

我可以添加,喬恩斯基特的教程here告訴我,不同用戶之間的溝通,那麼我想LocalSystem是,需要前綴mutex名以「全球\」。我在.NET文檔中找不到任何提及,我想他是對的,我必須比MSDN系統更注重MSDN系統。

回答

1

如何取得所有權上已經存在的互斥鎖,你可以使用靜態方法Mutex.OpenExisting()與MutexRights = TakeOwnership

public static Mutex OpenExisting(
           string name,  
           MutexRights rights) 
  • 權利參數必須包括MutexRights.Synchronize標誌允許線程等待互斥和MutexRights.Modify標誌允許它們調用ReleaseMutex()方法。
  • OpenExisting方法嘗試打開現有的已命名互斥體。如果系統互斥體不存在,則此方法將引發異常而不是創建系統對象。

考慮到OpenExisting()可以拋出UnauthorizedAccessException例外,我會建議使用下面的構造函數來創建一個新的Mutex:

public Mutex(
    bool initiallyOwned, 
    string name, 
    out bool createdNew 
) 

,然後通過分析createdNew變量的值,你可以檢查是否mutext已經存在或新的創建。

+0

幾乎和你一樣,當我閱讀gmamaladze的代碼時,讀到了我在我的回答中鏈接的頁面(之前可以)!儘管如此,我不會厭倦聽到它再說。令我困惑的是,第一個和第二個調用者都擁有相同的已命名互斥體?因爲兩者都必須先釋放它才能鎖定它?這似乎違反了我一次只有一次鎖定的目標。 – John

+0

@John:所以如果你意識到這種技術,問題是什麼? – sll

+0

嗯,我不能重新鍵入''''''''''''''''''''''''''''''的智能感知參數描述,但如果它是錯誤的,我會收集它,或者指定的互斥量已經存在,那麼返回的互斥量就是對已經擁有的互斥量的引用。但是這引出了一個問題:「如果我提供虛假並且它還沒有擁有」,那麼我會提及一個無主的互斥體。我認爲這是正確的。 – John

0

第一處理:

// Create a new Mutex. 
// True means this thread/process has inital ownership 
Mutex mut = new Mutex(true, "some unique name"); 
//Now do your job 
//Release ownership 
mut.ReleaseMutex(); 

現在對於第二過程的代碼。

// Create an instance of mutex object with the same name 
// This means this thread/process has NOT inital ownership 
Mutex mut = Mutex.OpenExisting("some unique name"); 
//Your thread will block until the first passes ownership 
mut.WaitOne(); 
//Now you have it and can do your job 
+0

中的Mutex類成員即可。他們不是我的第一和第二,而是平等的。在VS中,智能感知告訴我,第一個參數適用_if_互斥體是由於調用而創建的。因此,如果您稱'第一'爲秒,那麼它不能認爲它擁有所有權。這就是我閱讀它的方式。 – John

0

This頁似乎已經相當完全回答我的問題,這裏的味道:

好了,成功mutex.WaitOne()後,已經完成了當前線程是互斥的所有者。然後在對mutex.ReleaseMutex()的調用之後,該線程不再擁有該互斥體。