多線程:使用MFC同步處理類別的時機
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 進行多線程處理。