Mutex 物件

Mutex 物件是同步處理物件,其狀態設定為未由任何執行緒擁有時發出訊號,並在擁有時未簽署。 一次只能有一個執行緒擁有 Mutex 物件,其名稱來自它對於協調共用資源互斥存取很有用的事實。 例如,為了避免兩個執行緒同時寫入共用記憶體,每個執行緒會先等候 Mutex 物件的擁有權,再執行存取記憶體的程式碼。 寫入共用記憶體之後,執行緒會釋放 mutex 物件。

執行緒會使用CreateMutex 或 CreateMutexEx函式來建立 mutex 物件。 建立執行緒可以要求 mutex 物件的立即擁有權,也可以指定 mutex 物件的名稱。 它也可以建立未命名的 Mutex。 如需 mutex、事件、號志和計時器物件名稱的其他資訊,請參閱 進程間同步處理

其他進程中的執行緒可以在 呼叫 OpenMutex 函式時指定其名稱,以開啟現有具名 mutex 物件的控制碼。 若要將控制碼傳遞至未命名的 Mutex 至另一個進程,請使用 DuplicateHandle 函式或父子控制碼繼承。

任何具有 mutex 物件控制碼的執行緒都可以使用其中一個 等候函式 來要求 mutex 物件的擁有權。 如果 mutex 物件是由另一個執行緒所擁有,則 wait 函式會封鎖要求執行緒,直到擁有線程使用 ReleaseMutex 函式釋放 Mutex 物件為止。 wait 函式的傳回值會指出函式是否因為某些原因而傳回,而不是設定為已發出訊號之 Mutex 的狀態。

如果有多個執行緒正在等候 Mutex,則會選取等候中的執行緒。 請勿假設先入先出 (FIFO) 順序。 核心模式 APC 之類的外來事件可以變更等候順序。

執行緒取得 Mutex 的擁有權之後,就可以在重複呼叫 wait-functions 時指定相同的 mutex,而不會封鎖其執行。 這可防止執行緒在等候已經擁有的 Mutex 時自行死結。 若要在這類情況下釋放其擁有權,執行緒必須在每次 mutex 滿足 wait 函式的條件時呼叫 ReleaseMutex 一次。

如果執行緒終止而不釋放 mutex 物件的擁有權,則會將 mutex 物件視為放棄。 等候執行緒可以取得已放棄 Mutex 物件的擁有權,但 wait 函式會 傳回WAIT_ABANDONED ,以指出 mutex 物件已放棄。 已放棄的 Mutex 物件表示發生錯誤,且 Mutex 物件所保護的任何共用資源都處於未定義狀態。 如果執行緒繼續,就像尚未放棄 Mutex 物件一樣,執行緒釋放其擁有權之後,就不會再將其視為已放棄。 如果後續在等候函式中指定 mutex 物件的控制碼,這會還原正常行為。

請注意, 重要區段物件 提供的同步處理類似于 mutex 物件所提供的同步處理,不同之處在于關鍵區段物件只能由單一進程的執行緒使用。

使用 Mutex 物件