Wielowątkowość: kiedy należy używać klas synchronizacji MFC
Klasy wielowątkowe dostarczane z MFC dzielą się na dwie kategorie: obiekty synchronizacji (CSyncObject, CSemaphore, CMutex, CCriticalSection i CEvent) oraz obiekty dostępu do synchronizacji (CMultiLock i CSingleLock).
Klasy synchronizacji są używane, gdy dostęp do zasobu musi być kontrolowany, aby zapewnić integralność zasobu. Klasy dostępu synchronizacji służą do uzyskiwania dostępu do tych kontrolowanych zasobów. W tym temacie opisano, kiedy należy używać każdej klasy.
Aby określić, której klasy synchronizacji należy użyć, zadaj następujące pytania:
Czy aplikacja musi czekać, zanim uzyska dostęp do zasobu (na przykład dane muszą zostać odebrane z portu komunikacji, zanim będzie można zapisać go w pliku)?
Jeśli tak, użyj polecenia
CEvent
.Czy więcej niż jeden wątek w ramach tej samej aplikacji może jednocześnie uzyskiwać dostęp do tego zasobu (na przykład aplikacja zezwala na maksymalnie pięć okien z widokami w tym samym dokumencie)?
Jeśli tak, użyj polecenia
CSemaphore
.Czy więcej niż jedna aplikacja może używać tego zasobu (na przykład zasób znajduje się w dll)?
Jeśli tak, użyj polecenia
CMutex
.Jeśli nie, użyj polecenia
CCriticalSection
.
CSyncObject
nigdy nie jest używany bezpośrednio. Jest to klasa bazowa dla pozostałych czterech klas synchronizacji.
Przykład 1: Używanie trzech klas synchronizacji
Na przykład weźmy aplikację, która utrzymuje połączoną listę kont. Ta aplikacja umożliwia przeanalizowanie maksymalnie trzech kont w oddzielnych oknach, ale tylko jedno można zaktualizować w dowolnym momencie. Po zaktualizowaniu konta zaktualizowane dane są wysyłane przez sieć do archiwum danych.
W tej przykładowej aplikacji są używane wszystkie trzy typy klas synchronizacji. Ponieważ pozwala to na badanie maksymalnie trzech kont jednocześnie, używa CSemaphore
go do ograniczania dostępu do trzech obiektów widoku. Gdy zostanie podjęta próba wyświetlenia czwartego konta, aplikacja zaczeka na zamknięcie jednego z trzech pierwszych okien lub niepowodzenie. Po zaktualizowaniu konta aplikacja używa CCriticalSection
polecenia , aby upewnić się, że tylko jedno konto jest aktualizowane jednocześnie. Po pomyślnym zakończeniu aktualizacji sygnalizuje CEvent
ona komunikat , który zwalnia wątek oczekujący na sygnał zdarzenia. Ten wątek wysyła nowe dane do archiwum danych.
Przykład 2. Używanie klas dostępu do synchronizacji
Wybór klasy dostępu do synchronizacji do użycia jest jeszcze prostszy. Jeśli aplikacja dotyczy uzyskiwania dostępu tylko do pojedynczego kontrolowanego zasobu, użyj polecenia CSingleLock
. Jeśli potrzebuje dostępu do dowolnego z wielu kontrolowanych zasobów, użyj polecenia CMultiLock
. W przykładzie 1 CSingleLock
użyto elementu , ponieważ w każdym przypadku w danym momencie potrzebny jest tylko jeden zasób.
Aby uzyskać informacje o sposobie używania klas synchronizacji, zobacz Multithreading: How to Use the Synchronization Classes (Jak używać klas synchronizacji). Aby uzyskać informacje o synchronizacji, zobacz Synchronizacja w zestawie Windows SDK. Aby uzyskać informacje o obsłudze wielowątków w MFC, zobacz Multithreading with C++ and MFC (Obsługa wielowątkowość w języku C++ i MFC).