Sdílet prostřednictvím


Multithreading: Kdy použít synchronizační třídy

Třídy s více vlákny dodávané s knihovnou MFC spadají do dvou kategorií: Synchronizační objekty (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í synchronizačních přístupových tříd [C++]

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.

Pro informace o použití tříd synchronizace si prohlédněte Multithreading: Jak použít 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 knihovnou MFC