多執行緒:何時使用同步類別
MFC 所提供的多執行緒類別可以分成兩類:同步物件 (CSyncObject、CSemaphore、CMutex、CCriticalSection 和 CEvent) 以及同步存取物件 (CMultiLock 和 CSingleLock)。
必須控制對資源的存取以確定資源完整性的時候,就會用到同步類別。同步存取類別用來取得這些受控制資源的存取。本主題說明何時使用每一個類別。
若要決定應該使用哪一個同步類別,請檢視下列一系列的問題:
應用程式必須等候事情發生之後才能存取資源嗎 (例如,資料必須先從通訊連接埠接收之後才能寫入至檔案)?
如果是,請使用 CEvent。
相同應用程式內可以有一個以上的執行緒同時存取這個資源嗎 (例如,您的應用程式允許最多五個視窗具有相同的文件上的檢視)?
如果是,請使用 CSemaphore。
可以有一個以上的應用程式使用這個資源嗎 (例如,資源在 DLL 中)?
如果是,使用 CMutex。
如果不是,使用 CCriticalSection。
CSyncObject 絕對不會直接使用。它是其他四個同步類別的基底類別。
範例 1:使用三個同步類別
例如,取得維護帳戶之連結串列的應用程式。這個帳戶最多允許在不同視窗中查看三個帳戶,但一次只能有一個可以被更新。當更新帳戶時,更新的資料會經由網路傳送到資料保存。
這個範例使用全部三種同步類別。因為同一時間它允許檢查最多三個帳戶,它使用 CSemaphore 來限制三個檢視物件的存取。嘗試檢視第四個帳戶時,應用程式會等候前三個視窗其中之一關閉,否則便會失敗。帳戶被更新時,應用程式使用 CCriticalSection 來確定一次只更新一個帳戶。更新成功之後,會發送訊號到 CEvent,以釋放等候被發送信號之事件的執行緒。這個執行緒會將新資料傳送到資料保存。
範例 2:使用同步存取類別
選擇要使用哪一個同步存取類別則更加簡單。如果您的應用程式只考慮單一控制資源的存取,請使用 CSingleLock。如果它需要存取許多受控制資源中的一種,請使用 CMultiLock。範例 1 中可能會使用 CSingleLock,因為在每個情況中的任何特定時間內只需要一種資源。
如需如何使用同步類別的詳細資訊,請參閱多執行緒:如何使用同步類別。如需同步處理的詳細資訊,請參閱 Windows SDK 中的同步處理。如需 MFC 多執行緒支援的詳細資訊,請參閱使用 C++ 和 MFC 進行多執行緒處理。