Mutex 物件
mutex 物件 是同步處理物件,其狀態設定為未由任何線程擁有時發出訊號,且在擁有時未簽署。 一次只有一個線程可以擁有 Mutex 物件,其名稱來自協調共用資源的互斥存取很有用的事實。 例如,若要防止兩個線程同時寫入共用記憶體,每個線程會先等候 Mutex 物件的擁有權,再執行存取記憶體的程式代碼。 寫入至共用記憶體之後,線程會釋放 mutex 物件。
線程會使用 CreateMutex 或 CreateMutexEx 函式來建立 mutex 物件。 建立線程可以要求 Mutex 物件的立即擁有權,也可以指定 Mutex 物件的名稱。 它也可以建立未命名的 Mutex。 如需 mutex、事件、旗號和定時器物件名稱的其他資訊,請參閱 Interprocess 同步處理。
其他進程中的線程可以在呼叫 openMutex 函式時指定其名稱,以開啟現有具名 mutex 物件的句柄。 若要將句柄傳遞至未命名的 mutex 至另一個進程,請使用 DuplicateHandle 函式或父子句柄繼承。
任何具有 mutex 物件句柄的線程都可以使用其中一個 等候函式 來要求 mutex 物件的擁有權。 如果 mutex 物件是由另一個線程所擁有,等候函式會封鎖要求線程,直到擁有線程使用 releaseMutex 函式釋放 mutex 物件為止。 wait 函式的傳回值會指出函式是否基於設定為訊號的 Mutex 狀態以外的某些原因傳回。
如果多個線程在 Mutex 上等候,則會選取等候的線程。 請勿假設先出先出 (FIFO) 順序。 核心模式 APC 等外部事件可以變更等候順序。
線程取得 mutex 的擁有權之後,可以在重複呼叫 wait-functions 時指定相同的 mutex, 而不封鎖其執行。 這可防止線程在等候已擁有的 Mutex 時自行死結。 若要在這類情況下釋放其擁有權,線程必須在每次 mutex 符合等候函式條件時呼叫 ReleaseMutex 一次。
如果線程在未釋放 Mutex 物件的擁有權的情況下終止,則會將 Mutex 對象視為已放棄。 等候的線程可以取得已放棄 Mutex 物件的擁有權,但等候函式會傳回 WAIT_ABANDONED,表示已放棄 Mutex 物件。 已放棄的 Mutex 物件表示發生錯誤,且任何受 Mutex 物件保護的共用資源都處於未定義狀態。 如果線程繼續,就像 Mutex 物件尚未放棄一樣,在線程釋放其擁有權之後,就不會再將其視為已放棄。 如果 mutex 物件的句柄後續在等候函式中指定,這會還原正常行為。
請注意,重要區段物件 提供類似 Mutex 物件所提供的同步處理,不同之處在於關鍵區段物件只能由單一進程的線程使用。
相關主題