Wielowątkowość: kiedy używać klas synchronizacji
Wielowątkowe klas przedstawionych MFC dzielą się na dwie kategorie: obiektów synchronizacji (CSyncObject, CSemaphore, CMutex, CCriticalSection, i klasy CEvent) i synchronizacji dostępu do obiektów (CMultiLock i CSingleLock).
Synchronizacja klas są używane podczas dostępu do zasobu muszą być kontrolowane w celu zapewnienia integralności zasobu.Synchronizacja dostępu do klasy są używane do uzyskania dostępu do tych zasobów kontrolowanych.W tym temacie opisano, kiedy należy używać poszczególnych klas.
Aby ustalić, która z klas synchronizacji należy użyć, poproś następujący szereg pytań:
Czy aplikacja ma czekać na coś się stanie, aby umożliwić dostęp do zasobów (na przykład danych musi być pobrana z portu komunikacyjnego przed mogą być zapisywane w pliku)?
If yes, use CEvent.
Może więcej niż jednym wątku w taki sam dostęp aplikacji tego zasobu w tym samym czasie (na przykład, aplikacja pozwala maksymalnie pięć okna z widokiem na tym samym dokumencie)?
If yes, use CSemaphore.
Można użyć więcej niż jeden wniosek ten zasób (na przykład zasób jest w bibliotece DLL)?
If yes, use CMutex.
If no, use CCriticalSection.
CSyncObject nigdy nie jest używany bezpośrednio.Jest klasą bazową dla innych klas synchronizacji cztery.
Przykład 1: Korzystanie z trzech klas synchronizacji
Na przykład podjąć aplikację, która utrzymuje listę połączonych kont.Aplikacja ta pozwala maksymalnie trzy konta należy zbadać w osobnych oknach, ale mogą być aktualizowane tylko jeden w każdej chwili w szczególności.Po zaktualizowaniu konto zaktualizowane dane są przesyłane przez sieć do archiwum danych.
Ten przykład aplikacja wykorzystuje wszystkie trzy typy klas synchronizacji.Ponieważ pozwala maksymalnie trzy konta zostały poddane kontroli w tym samym czasie, używa CSemaphore Aby ograniczyć dostęp do trzech obiektów widoku.Podczas próby wyświetlenia czwartego konta wystąpienia aplikacji, albo czeka, aż jeden z pierwszych trzech oknach zostaje zamknięty lub nie jest on.Po zaktualizowaniu konto używane przez aplikację CCriticalSection do zapewnienia, że w danej chwili jest aktualizowany tylko jedno konto.Po aktualizacji zakończy się pomyślnie, sygnalizuje CEvent, który uwalnia wątku oczekiwania na zdarzenia być informowany.Ten wątek wysyła nowe dane do archiwum danych.
Przykład 2: Korzystanie z klas dostępu do synchronizacji
Wybranie opcji, które klasy dostępu do synchronizacji jest jeszcze prostsze.Jeśli aplikacja dotyczy tylko jednego zasobu kontrolowany dostęp do, użyj CSingleLock.Jeśli będzie potrzebował dostępu do jednego z wielu zasobów kontrolowanych, użyj CMultiLock.W przykładzie 1 CSingleLock czy zostały użyte, ponieważ w każdym przypadku potrzebna jest tylko jeden zasób w jakimkolwiek terminie.
Aby uzyskać informacji na temat używania klas synchronizacji, zobacz wielowątkowość: jak używać klasy synchronizacji.Aby uzyskać informacje o synchronizacji, zobacz synchronizacji w Windows SDK.Informacje wielowątkowego MFC, zobacz wielowątkowość z C++ i MFC.