Dela via


Multitrådning: När MFC-synkroniseringsklasserna ska användas

De flertrådade klasserna som medföljer MFC finns i två kategorier: synkroniseringsobjekt (CSyncObject, CSemaphore, CMutex, CCriticalSection och CEvent) och synkroniseringsåtkomstobjekt (CMultiLock och CSingleLock).

Synkroniseringsklasser används när åtkomsten till en resurs måste kontrolleras för att säkerställa resursens integritet. Synkroniseringsåtkomstklasser används för att få åtkomst till dessa kontrollerade resurser. I det här avsnittet beskrivs när du ska använda varje klass.

För att avgöra vilken synkroniseringsklass du ska använda ställer du följande frågor:

  1. Måste programmet vänta tills något händer innan det kan komma åt resursen (till exempel måste data tas emot från en kommunikationsport innan de kan skrivas till en fil)?

    Om ja, använd CEvent.

  2. Kan fler än en tråd i samma program komma åt den här resursen samtidigt (till exempel tillåter programmet upp till fem fönster med vyer i samma dokument)?

    Om ja, använd CSemaphore.

  3. Kan fler än ett program använda den här resursen (till exempel finns resursen i en DLL)?

    Om ja, använd CMutex.

    Om nej använder du CCriticalSection.

CSyncObject används aldrig direkt. Det är basklassen för de övriga fyra synkroniseringsklasserna.

Exempel 1: Använda tre synkroniseringsklasser

Ta till exempel ett program som har en länkad lista med konton. Det här programmet gör att upp till tre konton kan granskas i separata fönster, men endast ett kan uppdateras vid en viss tidpunkt. När ett konto uppdateras skickas uppdaterade data via nätverket till ett dataarkiv.

Det här exempelprogrammet använder alla tre typerna av synkroniseringsklasser. Eftersom det gör att upp till tre konton kan granskas samtidigt, används CSemaphore det för att begränsa åtkomsten till tre visningsobjekt. När ett försök att visa ett fjärde konto inträffar väntar programmet antingen tills ett av de tre första fönstren stängs eller så misslyckas det. När ett konto uppdateras används CCriticalSection programmet för att säkerställa att endast ett konto uppdateras i taget. När uppdateringen har slutförts signalerar CEvent, vilket frigör en tråd som väntar på att händelsen ska signaleras. Den här tråden skickar nya data till dataarkivet.

Exempel 2: Använda åtkomstklasser för synkronisering

Det är ännu enklare att välja vilken synkroniseringsåtkomstklass som ska användas. Om ditt program endast har åtkomst till en enda kontrollerad resurs använder du CSingleLock. Om den behöver åtkomst till någon av ett antal kontrollerade resurser använder du CMultiLock. I exempel 1 CSingleLock skulle ha använts, eftersom det i varje fall bara behövs en resurs vid en viss tidpunkt.

Information om hur synkroniseringsklasserna används finns i Multithreading: How to Use the Synchronization Classes (Flerläsning: Så här använder du synkroniseringsklasserna). Information om synkronisering finns i Synkronisering i Windows SDK. Information om stöd för multitrådning i MFC finns i Multithreading with C++ and MFC (Multithreading with C++ and MFC).

Se även

Multitrådning med C++ och MFC