Wielowątkowość: Kiedy należy używać klasy synchronizacji
Wielowątkowa klas z MFC dzielą się na dwie kategorie: synchronizacja obiektów (CSyncObject, CSemaphore, CMutex, CCriticalSection, i CEvent) i obiektów dostępu do synchronizacji (CMultiLock i CSingleLock).
Synchronizacja klasy są używane podczas dostępu do zasobu, muszą być kontrolowane w celu zapewnienia integralności zasobu.Synchronizacja dostępu klasy są używane do uzyskania dostępu do tych zasobów kontrolowanych.W tym temacie opisano, kiedy należy używać każdej klasy.
Aby określić, które klasy synchronizacji należy użyć, poproś następującą serię pytań:
Czy aplikacja ma czekać na coś przed może uzyskać dostęp do zasobu (na przykład dane muszą być odbierane z portu komunikacyjnego przed mogą być zapisywane w pliku)?
If yes, use CEvent.
Można więcej niż jednym wątku w tym samym dostęp do aplikacji tego zasobu w tym samym czasie (na przykład, aplikacja pozwala maksymalnie pięć windows widoki na tym samym dokumencie)?
If yes, use CSemaphore.
Więcej niż jeden wniosek służy tego zasobu (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ą podstawową dla czterech innych klas synchronizacji.
Przykład 1: Za pomocą trzech klas synchronizacji
Na przykład można podjąć aplikacji, która utrzymuje połączonej listy kont.Ta aplikacja pozwala maksymalnie trzy konta badane w osobnych oknach, ale tylko jeden można aktualizować określonej godzinie.Po zaktualizowaniu konta zaktualizowanych danych przesyłanych w sieci do archiwum danych.
Ten przykład, aplikacja wykorzystuje wszystkie trzy typy klas synchronizacji.Ponieważ pozwala maksymalnie trzy konta badane jednocześnie używa CSemaphore Aby ograniczyć dostęp do trzech obiektów w widoku.Podczas próby wyświetlenia czwarty konta występuje aplikacji, albo czeka, aż jeden zamknięciu pierwsze trzy systemu windows lub ją ulegnie awarii.Po zaktualizowaniu konto używane przez aplikację CCriticalSection do zapewnienia, że tylko jedno konto jest aktualizowany w czasie.Po pomyślnym aktualizacji, sygnały CEvent, który zwalnia wątek oczekuje na zdarzenie zasygnalizowanie.Wątek ten wysyła nowe dane do archiwum danych.
Przykład 2: Korzystanie z klas dostępu synchronizacji
Po wybraniu opcji Użyj klasy dostępu synchronizacji jest jeszcze prostsze.Jeśli aplikacja dotyczy tylko pojedynczy zasób kontrolowany dostęp, użyj CSingleLock.Jeśli potrzebuje dostępu do jednego z Liczba kontrolowanych zasobów, użyj CMultiLock.W przykładzie 1 CSingleLock została wykorzystana, ponieważ w każdym przypadku potrzebna jest tylko jeden zasób określonej godzinie.
Aby uzyskać informacje dotyczące używania klas synchronizacji, zobacz Multithreading: jak używać klasy synchronizacji.Aby uzyskać informacje o synchronizacji, zobacz synchronizacji w Windows SDK.Informacje o obsługę wielowątkowości w MFC, zobacz Multithreading z C++ i MFC.