Delen via


Multithreading: Wanneer gebruikt u de MFC-synchronisatieklassen

De multithreaded klassen van MFC vallen in twee categorieën: synchronisatieobjecten (CSyncObject, CSemaphore, CMutex, CCriticalSection en CEvent) en synchronisatietoegangsobjecten (CMultiLock en CSingleLock).

Synchronisatieklassen worden gebruikt wanneer toegang tot een resource moet worden beheerd om de integriteit van de resource te waarborgen. Synchronisatietoegangsklassen worden gebruikt om toegang te krijgen tot deze beheerde resources. In dit onderwerp wordt beschreven wanneer u elke klasse gebruikt.

Stel de volgende reeks vragen om te bepalen welke synchronisatieklasse u moet gebruiken:

  1. Moet de toepassing wachten tot er iets gebeurt voordat deze toegang heeft tot de resource (bijvoorbeeld gegevens moeten worden ontvangen van een communicatiepoort voordat deze naar een bestand kan worden geschreven)?

    Zo ja, gebruik CEventdan .

  2. Kan meer dan één thread in dezelfde toepassing tegelijk toegang krijgen tot deze resource (uw toepassing staat bijvoorbeeld maximaal vijf vensters met weergaven in hetzelfde document toe)?

    Zo ja, gebruik CSemaphoredan .

  3. Kan meer dan één toepassing deze resource gebruiken (de resource bevindt zich bijvoorbeeld in een DLL)?

    Zo ja, gebruik CMutexdan .

    Als nee, gebruikt u CCriticalSection.

CSyncObject wordt nooit rechtstreeks gebruikt. Dit is de basisklasse voor de andere vier synchronisatieklassen.

Voorbeeld 1: Drie synchronisatieklassen gebruiken

Neem bijvoorbeeld een toepassing die een gekoppelde lijst met accounts onderhoudt. Met deze toepassing kunnen maximaal drie accounts in afzonderlijke vensters worden onderzocht, maar er kan slechts één op een bepaald moment worden bijgewerkt. Wanneer een account wordt bijgewerkt, worden de bijgewerkte gegevens via het netwerk naar een gegevensarchief verzonden.

In deze voorbeeldtoepassing worden alle drie de typen synchronisatieklassen gebruikt. Omdat hiermee maximaal drie accounts tegelijk kunnen worden onderzocht, wordt er gebruikgemaakt van CSemaphore om de toegang tot drie weergaveobjecten te beperken. Wanneer een poging om een vierde account weer te geven plaatsvindt, wacht de toepassing totdat een van de eerste drie vensters wordt gesloten of mislukt. Wanneer een account wordt bijgewerkt, gebruikt CCriticalSection de toepassing om ervoor te zorgen dat slechts één account tegelijk wordt bijgewerkt. Nadat de update is voltooid, geeft CEvent een signaal af dat een thread vrijgeeft die wacht tot de gebeurtenis is gesignaleerd. Met deze thread worden de nieuwe gegevens naar het gegevensarchief verzonden.

Voorbeeld 2: Synchronisatietoegangsklassen gebruiken

Het kiezen van welke synchronisatietoegangsklasse moet worden gebruikt, is nog eenvoudiger. Als uw toepassing alleen toegang heeft tot één beheerde resource, gebruikt u CSingleLock. Als het toegang nodig heeft tot een van een van een aantal gecontroleerde resources, gebruikt u CMultiLock. In voorbeeld 1 CSingleLock zou zijn gebruikt, omdat in elk geval slechts één resource nodig is op een bepaald moment.

Zie Multithreading voor informatie over hoe de synchronisatieklassen worden gebruikt : De synchronisatieklassen gebruiken. Zie Synchronisatie in de Windows SDK voor meer informatie over synchronisatie. Zie Multithreading met C++ en MFC voor informatie over multithreading-ondersteuning in MFC.

Zie ook

Multithreading met C++ en MFC