共用方式為


同步處理多個線程的執行

若要避免競爭狀況和死結,您必須同步處理多個執行緒對共用資源的存取。 同步處理也需要確保相依性程序代碼是以適當的順序執行。

有一些物件可以使用其句柄來以同步多個執行緒。 這些物件包括:

  • 主控台輸入緩衝區
  • 事件
  • Mutexes
  • 過程
  • 信號燈
  • 線程
  • 定時器

每個物件的狀態都會發出訊號或未發出訊號。 當您在呼叫其中一個 等候函式中指定這些物件的句柄時,呼叫線程的執行會遭到封鎖,直到指定物件的狀態收到訊號為止。

在發生某些事件之前,有些對象在封鎖線程方面很有用。 例如,當有未讀取的輸入時,控制台輸入緩衝區句柄會發出訊號,例如按鍵或滑鼠按鈕按兩下。 進程和線程句柄會在進程或線程終止時發出訊號。 例如,這可讓進程建立子進程,然後封鎖自己的執行,直到新進程終止為止。

其他物件有助於保護共用資源免於同時存取。 例如,多個線程可以各自擁有 Mutex 物件的控制代碼。 存取共享資源之前,線程必須呼叫其中一個 等候函式, 等候 mutex 的狀態發出訊號。 當 mutex 被設置為有信號時,只會釋放一個等候的執行緒來存取資源。 Mutex 的狀態會立即重設為未收到訊號,因此任何其他等候的線程仍會遭到封鎖。 當線程完成資源時,它必須將 mutex 的狀態設定為已發出訊號,以允許其他線程存取資源。

對於單一進程的線程,關鍵區段物件提供比 Mutex 更有效率的同步處理方式。 重要區段會像 Mutex 一樣使用,一次啟用一個線程來使用受保護的資源。 線程可以使用 EnterCriticalSection 函式來要求重要區段的擁有權。 如果它已經由另一個線程所擁有,則會封鎖要求線程。 線程可以使用 TryEnterCriticalSection 函式來要求重要區段的擁有權,而不會在無法取得重要區段時封鎖。 在收到擁有權之後,線程就可供使用受保護的資源。 除非它們嘗試進入相同的關鍵區段,否則該進程的其他線程執行不會受到影響。

WaitForInputIdle 函式會讓執行緒等待,直到指定的程序被初始化並等候使用者輸入,而沒有任何待處理的輸入。 呼叫 WaitForInputIdle 對於同步處理父進程和子進程很有用,因為 CreateProcess 傳回,而不需要等待子進程完成其初始化。

如需詳細資訊,請參閱 同步處理