Multithreading: Kdy použít synchronizační třídy MFC
Multithreaded třídy poskytované mfc spadají do dvou kategorií: synchronizační objekty (CSyncObject, CSemaphore, CMutex, CCriticalSection a CEvent) a synchronizační přístupové objekty (CMultiLock a CSingleLock).
Třídy synchronizace se používají, když je potřeba řídit přístup k prostředku, aby se zajistila integrita prostředku. Synchronizační třídy přístupu se používají k získání přístupu k těmto řízeným prostředkům. Toto téma popisuje, kdy použít každou třídu.
Pokud chcete zjistit, kterou synchronizační třídu byste měli použít, položte následující řadu otázek:
Musí aplikace počkat, až se něco stane, než bude mít přístup k prostředku (například data musí být přijata z komunikačního portu, než se zapíše do souboru)?
Pokud ano, použijte
CEvent
.Může více než jedno vlákno ve stejné aplikaci přistupovat k tomuto prostředku najednou (například vaše aplikace umožňuje až pět oken se zobrazeními ve stejném dokumentu)?
Pokud ano, použijte
CSemaphore
.Může tento prostředek používat více než jedna aplikace (například prostředek je v knihovně DLL)?
Pokud ano, použijte
CMutex
.Pokud ne, použijte
CCriticalSection
.
CSyncObject
se nikdy nepoužívá přímo. Je to základní třída pro ostatní čtyři synchronizační třídy.
Příklad 1: Použití tří synchronizačních tříd
Jako příklad vezměte aplikaci, která udržuje propojený seznam účtů. Tato aplikace umožňuje zkoumat až tři účty v samostatných oknech, ale v každém konkrétním okamžiku je možné aktualizovat pouze jeden. Při aktualizaci účtu se aktualizovaná data posílají přes síť do archivu dat.
Tato ukázková aplikace používá všechny tři typy tříd synchronizace. Vzhledem k tomu, že umožňuje zkoumání až tří účtů najednou, používá CSemaphore
k omezení přístupu na tři objekty zobrazení. Když dojde k pokusu o zobrazení čtvrtého účtu, aplikace buď počká, dokud se jedno z prvních tří oken nezavře nebo se nezdaří. Při aktualizaci účtu aplikace zajistí CCriticalSection
, že se současně aktualizuje jenom jeden účet. Po úspěšném dokončení aktualizace signalizuje CEvent
, který uvolní vlákno čekající na signalizovat událost. Toto vlákno odešle nová data do archivu dat.
Příklad 2: Použití synchronizačních tříd přístupu
Volba třídy přístupu k synchronizaci, která se má použít, je ještě jednodušší. Pokud se vaše aplikace zabývá pouze přístupem k jednomu řízenému prostředku, použijte CSingleLock
. Pokud potřebuje přístup k některému z několika řízených prostředků, použijte CMultiLock
. V příkladu 1 by se použilo, CSingleLock
protože v každém případě je v každém případě potřeba vždy jenom jeden prostředek.
Informace o tom, jak se třídy synchronizace používají, naleznete v tématu Multithreading: Jak používat synchronizační třídy. Informace o synchronizaci naleznete v tématu Synchronizace v sadě Windows SDK. Informace o podpoře multithreadingu v prostředí MFC naleznete v tématu Multithreading s C++ a MFC.