【多線程學習】:互斥鎖Mutex


開始的時候自己寫了段代碼,其中有句關於Mutex聲明方式,分別采用了帶名稱的和不帶名稱的,代碼如下:

//Mutex mutex = new Mutex(false, "MyMutex");//帶名稱
Mutex mutex = new Mutex(false); //不帶名稱
mutex.WaitOne();
try
{
string str = ".....";//省略......
Console.WriteLine(str);
Thread.Sleep(1000);

}
catch (Exception)
{
}
mutex.ReleaseMutex();


其中帶名稱和不帶名稱的執行順序顯示不同,截圖:

帶有初始名稱的聲明方法的運行結果顯示如下:

 

不帶初始名稱的聲明方法的運行結果顯示如下:

 

運行了很多次,都是這樣的執行的順序。沒想明白原因,后來查MSDN,有了解到一些關於Mutex的其他內容,現在請看MSDN對它的描述:

Mutex 類

一個同步基元,可用於進程間同步。

Mutex 構造函數:

public Mutex()

描述:

調用此構造函數重載相當於調用 Mutex(Boolean) 構造函數重載並將互斥體的初始所屬權指定為 false。      

也即調用線程不擁有此互斥體。

關於此構造函數的調用代碼連接:點擊打開鏈接

public Mutex(
bool initiallyOwned
)

描述:

用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。

參數

initiallyOwned
類型: System.Boolean
如果給調用線程賦予互斥體的初始所屬權,則為 true;否則為 false
public Mutex(
bool initiallyOwned,
string name
)

 

參數

initiallyOwned
類型: System.Boolean
如果為 true,則給予調用線程已命名的系統互斥體的初始所屬權(如果已命名的系統互斥體是通過此調用創建的);否則為 false
name
類型: System.String
Mutex 的名稱。 如果值為 null,則 Mutex 是未命名的。 

 

描述:

如果 name 不為 null  initiallyOwned  true,則只有當已命名的系統互斥體是通過此調用創建的時,調用線程才擁有該互斥體。 由於沒有機制來確定是否創建了已命名的系統互斥體,因此,當調用此構造函數重載時,最好將 initiallyOwned 指定為 false 如果需要確定初始所屬權,可以使用 Mutex(Boolean, String, Boolean) 構造函數。

此構造函數初始化 Mutex 對象,該對象表示命名的互斥體。 您可以創建多個 Mutex 對象來表示同一個已命名的系統互斥體。

如果創建的已命名互斥體已經具備訪問控制安全性,而調用方沒有 MutexRights.FullControl,則會引發一個異常。 若要僅使用對線程活動進行同步所需的權限打開現有的已命名互斥體,請參見 OpenExisting 方法。

如果將 name 指定為 null 或空字符串,則創建一個局部互斥體,這和調用 Mutex(Boolean) 構造函數一樣。 這種情況下,createdNew 始終為 true

由於已命名的互斥體是系統范圍的,因此可以使用這些互斥體來協調跨進程邊界的資源使用。

{如果mutext是未命名的則只能在同一個進程中被識別,無法應用於多個進程}

 

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

使用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值、一個作為互斥體名稱的字符串,以及一個在方法返回時指示調用線程是否被授予互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。

參數

initiallyOwned
類型: System.Boolean
如果為 true,則給予調用線程已命名的系統互斥體的初始所屬權(如果已命名的系統互斥體是通過此調用創建的);否則為 false
name
類型: System.String
Mutex 的名稱。 如果值為 null,則 Mutex 是未命名的。 
createdNew
類型: System.Boolean %
在此方法返回時,如果創建了局部互斥體(即,如果 name  null 或空字符串)或指定的命名系統互斥體,則包含布爾值 true;如果指定的命名系統互斥體已存在,則為 false 該參數未經初始化即被傳遞。 

 

如果 name 不為 null  initiallyOwned  true,則只有當 createdNew 在調用后為 true 時,調用線程才擁有已命名的互斥體。 否則,此線程可通過調用 WaitOne 方法來請求互斥體。

此構造函數初始化 Mutex 對象,該對象表示命名的互斥體。 您可以創建多個 Mutex 對象來表示同一個已命名的系統互斥體。

如果創建的已命名互斥體已經具備訪問控制安全性,而調用方沒有 MutexRights.FullControl,則會引發一個異常。 若要僅使用對線程活動進行同步所需的權限打開現有的已命名互斥體,請參見 OpenExisting 方法。

如果將 name 指定為 null 或空字符串,則創建一個局部互斥體,這和調用 Mutex(Boolean) 構造函數一樣。 這種情況下,createdNew 始終為 true

由於已命名的互斥體是系統范圍的,因此可以使用這些互斥體來協調跨進程邊界的資源使用。

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

 

 

 

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com