Sdílet prostřednictvím


Multithreading: Použití třídy synchronizace

Podprocesy tříd MFC s spadají do dvou kategorií: objekty synchronizace (CSyncObject, CSemaphore, CMutex, CCriticalSection, a CEvent) a objekty pro přístup k synchronizaci (CMultiLock a CSingleLock).

Třídy synchronizace se používají v případě, že musí být přístup k prostředku kontrolován pro zajištění integrity prostředku.Třídy pro přístup k synchronizaci slouží k získání přístupu k těmto řízeným prostředkům.Toto téma popisuje kdy použít každou z tříd.

Chcete-li zjistit, kterou třídu synchronizace byste měli použít, odpovězte na následující řadu otázek:

  1. Musí aplikace čekat až se něco stane, než bude mít možnost přístupu k prostředku (například data musí být přijata z komunikačního portu dříve, než mohou být zapsána do souboru)?

    Pokud ano, použijte CEvent.

  2. Může více než jedno vlákno ve stejné aplikaci najednou přistupovat k tomuto prostředku (například vaše aplikace umožňuje až pět oken s pohledy na stejný dokument)?

    Pokud ano, použijte CSemaphore.

  3. Může více než jedna aplikace používat tento prostředek (prostředek je například 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 jiné čtyři třídy synchronizace.

Příklad 1: Použití tří tříd synchronizace

Jako příklad si vezměme aplikaci, která udržuje propojený seznam účtů.Tato aplikace umožňuje prohlížet až tři účty v samostatných oknech, ale pouze jeden lze v jednom čase aktualizovat.Při aktualizaci účtu jsou aktualizovaná data odeslána přes síť do datového archivu.

Tato ukázková aplikace používá všechny tři typy tříd synchronizace.Protože umožňuje prohlížení až tří účtů v jednom okamžiku, používá CSemaphore pro omezení přístupu ke třem objektům zobrazení.Při pokusu o zobrazení čtvrtého účtu aplikace buď čeká, dokud se jedno z prvních tří oken nezavře, nebo selže.Při aktualizaci účtu aplikace používá CCriticalSection pro zajištění, že bude v jednom okamžiku aktualizován pouze jeden účet.Po úspěšné aktualizaci signalizuje CEvent, což uvolní vlákno, čekající na signál události.Toto vlákno odesílá nová data do archivu dat.

Příklad 2: Použití tříd přístup synchronizace

Výběr, kterou synchronizační třídu přístupu použít je ještě jednodušší.Pokud se vaší aplikace týká přístup pouze k jedinému řízenému prostředku, použijte CSingleLock.Pokud potřebuje přístup k libovolnému z několika řízených prostředků, použijte CMultiLock.V příkladu 1 by byl použit CSingleLock, protože je v každém případě potřeba pouze jeden prostředek v jakémkoli čase.

Informace o použití třídy synchronizace, viz při souběžném: použití třídy synchronizace.Pro informace o synchronizaci si prohlédněte Synchronizace v Windows SDK.Pro informace o podpoře více vláken v knihovně MFC si prohlédněte Multithreading s C++ a knihovnou MFC.

Viz také

Koncepty

Multithreading s C++ a MFC