Sdílet prostřednictvím


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:

  1. 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.

  2. 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.

  3. 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.

Viz také

Multithreading s použitím jazyka C++ a prostředí MFC