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