同步處理多個執行緒的執行
若要避免競爭狀況和死結,您必須同步處理多個執行緒對共用資源的存取。 也需要同步處理,以確保相互依存的程式碼是以適當的循序執行。
有數個 物件,其控制碼可用來同步處理多個執行緒。 這些物件包括:
- 主控台輸入緩衝區
- 事件
- Mutex
- 處理序
- 信號燈
- 執行緒
- 計時器
這些物件的狀態會發出訊號或未發出訊號。 當您在呼叫其中一個 等候函式中指定這些物件的控制碼時,呼叫執行緒的執行會遭到封鎖,直到指定的物件狀態變成收到訊號為止。
在發生某些事件之前,這些物件在封鎖執行緒時很有用。 例如,主控台輸入緩衝區控制碼會在沒有讀取的輸入時發出訊號,例如按鍵或滑鼠按鍵按一下。 進程和執行緒控制碼會在進程或執行緒終止時發出訊號。 例如,這可讓進程建立子進程,然後封鎖自己的執行,直到新進程終止為止。
其他物件有助於保護共用資源免于同時存取。 例如,多個執行緒都可以有 Mutex 物件的控制碼。 存取共用資源之前,執行緒必須呼叫其中一個 等候函 式,才能等候 Mutex 的狀態發出訊號。 當 Mutex 收到訊號時,只會釋放一個等候中的執行緒來存取資源。 Mutex 的狀態會立即重設為未收到訊號,讓任何其他等候的執行緒保持封鎖狀態。 當執行緒完成資源時,它必須將 mutex 的狀態設定為已發出訊號,以允許其他執行緒存取資源。
對於單一進程的執行緒,critical-section 物件提供比 Mutex 更有效率的同步處理方式。 使用重要區段就像 Mutex 一次啟用一個執行緒,以使用受保護的資源。 執行緒可以使用 EnterCriticalSection 函式來要求重要區段的擁有權。 如果它已經由另一個執行緒擁有,則會封鎖要求執行緒。 執行緒可以使用 TryEnterCriticalSection 函式來要求重要區段的擁有權,而不會在無法取得重要區段時封鎖。 收到擁有權之後,執行緒就可以自由使用受保護的資源。 除非嘗試輸入相同的重要區段,否則進程的其他執行緒執行不會受到影響。
WaitForInputIdle 函式會讓執行緒等到指定的進程初始化,並等候使用者輸入,而沒有暫止的輸入。 呼叫 WaitForInputIdle 有助於同步處理父進程和子進程,因為 CreateProcess 會傳回而不等待子進程完成其初始化。
如需詳細資訊,請參閱 同步處理。