Wielowątkowość: Jak używać klasy synchronizacji
Synchronizowanie dostęp do zasobów między wątków jest typowy problem podczas pisania aplikacji wielowątkowych.Dwa lub więcej wątków jednocześnie dostępu do tych samych danych może prowadzić do niepożądanych i nieprzewidywalne rezultaty.Na przykład jeden wątek może aktualizować zawartość strukturę, podczas gdy inny wątek jest czytanie zawartości tej samej strukturze.Nie wiadomo, dane, które otrzymają wątek czytania: stare dane, nowo zapisywane dane lub ewentualnie mieszaniny.MFC udostępnia wiele synchronizacji oraz synchronizacji dostępu klas do pomocy w rozwiązaniu tego problemu.W tym temacie wyjaśniono dostępne klasy i sposób ich użycia do tworzenia klas wielowątkowość w typowych aplikacji wielowątkowych.
Typowa aplikacja wielowątkowe ma klasy, która reprezentuje zasób dzielony pomiędzy wątkami.Właściwie zaprojektowane, pełni wielowątkowość klasę nie wymaga wywoływać żadnych funkcji synchronizacji.Wszystko jest obsługiwana wewnętrznie klasa, umożliwiając koncentrować się na jak najlepsze wykorzystanie klasy, nie na temat sposobu może ulec uszkodzeniu.Skuteczne technika tworzenia klasy pełni wielowątkowość jest scalenie klasy synchronizacji klasy zasobu.Scalenie klas synchronizacja udostępnionych klasy jest dość proste.
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.
Projektowanie klasy wielowątkowość
Aby klasa pełni wielowątkowość, najpierw dodać klasy synchronizacji odpowiednich klas udostępnionego jako członek danych.W poprzednim przykładzie zarządzania kontami CSemaphore członek danych zostanie dodane do klasy widoku CCriticalSection członek danych zostanie dodane do klasy powiązane listy i CEvent członka danych, które zostałyby dodane do klasy magazynu danych.
Następnie dodaj synchronizacji wywołania wszystkich funkcji elementów członkowskich, które zmodyfikować dane w klasie lub dostępu do zasobów kontrolowanych.W każdej funkcji, należy utworzyć albo CSingleLock lub CMultiLock object i wywoływać ten obiekt Lock funkcji.Gdy obiekt Zablokuj wykracza poza zakres i jest niszczony, wywołuje destruktora obiektu Unlock , zwalniając zasobu.Oczywiście można wywołać Unlock bezpośrednio Chcąc.
Klasa wielowątkowość w ten sposób projektowania pozwala on być użyty w aplikacji wielowątkowych jak łatwo klasą non wielowątkowość, ale z wyższego poziomu bezpieczeństwa.Encapsulating obiektu synchronizacji oraz synchronizacji dostępu obiektu do klasy zasobu zawiera wszystkich świadczeń programowania pełni wielowątkowość bez ceł zwrotnych utrzymywanie synchronizacji kodu.
Poniższy przykład kodu pokazuje tę metodę, za pomocą członka danych, m_CritSection (typu CCriticalSection), a zadeklarowanych w klasie zasobu udostępnionego i CSingleLock obiektu.Synchronizacja z zasobu udostępnionego (pochodzące z CWinThread) podejmowana jest próba tworząc CSingleLock obiektu przy użyciu adresu m_CritSection obiektu.Próby zasób, i gdy uzyskane, praca jest wykonywana na obiekt współużytkowany.Po zakończeniu pracy zasobu jest odblokowany, wywołując Unlock.
CSingleLock singleLock(&m_CritSection);
singleLock.Lock();
// resource locked
//.usage of shared resource...
singleLock.Unlock();
[!UWAGA]
CCriticalSection, w przeciwieństwie do innych klas MFC synchronizacji nie ma opcji żądanie blokady tymczasowy.Okres oczekiwania dla wątku zwolnienie jest nieskończony.
Wady takie podejście są, że klasa będzie nieco wolniej niż tej samej klasy bez obiektów synchronizacji dodane.Również jeżeli istnieje prawdopodobieństwo, że więcej niż jeden wątek może usunąć obiektu, scalone podejście może nie zawsze działa.W tej sytuacji jest lepiej jest utrzymywać osobne synchronizacja obiektów.
Informacje o określaniu klasy synchronizacji, które w różnych sytuacjach, zobacz Multithreading: kiedy należy używać klasy synchronizacji.Aby uzyskać więcej informacji na temat synchronizacji, zobacz synchronizacji w Windows SDK.Aby uzyskać więcej informacji o obsłudze wielowątkowości w MFC, zobacz Multithreading z C++ i MFC.