天天看點

【多線程學習】:互斥鎖MutexMutex 類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();

           

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

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

【多線程學習】:互斥鎖MutexMutex 類Mutex 構造函數:

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

【多線程學習】:互斥鎖MutexMutex 類Mutex 構造函數:

運作了很多次,都是這樣的執行的順序。沒想明白原因,後來查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
)      

繼續閱讀