分享方式:


多執行緒:使用 MFC 同步處理類別的時機

MFC 所提供的多執行緒類別分為兩個類別:同步處理物件(CSyncObject、CSemaphore CMutex 、 CCriticalSection 和 CEvent )和同步存取物件 ( CMultiLock CSingleLock )。

必須控制對資源的存取權,以確保資源的完整性時,會使用同步處理類別。 同步處理存取類別可用來取得這些受控制資源的存取權。 本主題描述使用每個類別的時機。

若要判斷您應該使用的同步處理類別,請詢問下列一系列問題:

  1. 應用程式是否必須等待發生某些情況,才能存取資源(例如,資料必須從通訊埠接收,才能寫入檔案)?

    如果是,請使用 CEvent

  2. 同一個應用程式內的一個以上的執行緒可以一次存取此資源(例如,您的應用程式允許最多五個視窗在同一份檔上檢視)?

    如果是,請使用 CSemaphore

  3. 一個以上的應用程式可以使用此資源嗎?例如,資源位於 DLL 中嗎?

    如果是,請使用 CMutex

    如果沒有,請使用 CCriticalSection

CSyncObject 絕對不會直接使用。 它是其他四個同步處理類別的基類。

範例 1:使用三個同步處理類別

例如,採用維護帳戶連結清單的應用程式。 此應用程式允許在個別視窗中檢查最多三個帳戶,但在任何特定時間只能更新一個帳戶。 更新帳戶時,會透過網路將更新的資料傳送至資料封存。

這個範例應用程式會使用這三種類型的同步處理類別。 因為它允許一次檢查最多三個帳戶,所以它會使用 CSemaphore 來限制對三個檢視物件的存取。 嘗試檢視第四個帳戶時,應用程式會等到前三個視窗的其中一個關閉或失敗。 更新帳戶時,應用程式會使用 CCriticalSection 來確保一次只會更新一個帳戶。 更新成功之後,它會發出訊 CEvent 號,以釋放等候事件發出訊號的執行緒。 此執行緒會將新資料傳送至資料封存。

範例 2:使用同步處理存取類別

選擇要使用的同步處理存取類別甚至更簡單。 如果您的應用程式只考慮存取單一受控資源,請使用 CSingleLock 。 如果它需要存取任一個受控制的資源,請使用 CMultiLock 。 在範例 1 中, CSingleLock 會使用 ,因為在每個案例中,在任何特定時間只需要一個資源。

如需如何使用同步處理類別的資訊,請參閱 多執行緒:如何使用同步處理類別 。 如需同步處理的相關資訊,請參閱 Windows SDK 中的同步 處理。 如需 MFC 中多執行緒支援的相關資訊,請參閱 使用 C++ 和 MFC 進行多執行緒處理。

另請參閱

使用 C++ 和 MFC 進行多執行緒處理