Dela via


Multitrådning: MFC-programmeringstips

Flertrådade program kräver striktare vård än entrådade program för att säkerställa att åtgärder utförs i den avsedda ordningen och att alla data som används av flera trådar inte är skadade. Det här avsnittet beskriver tekniker för att undvika potentiella problem vid programmering av flertrådade program med MFC-biblioteket (Microsoft Foundation Class).

Komma åt objekt från flera trådar

MFC-objekt är inte trådsäkra själva. Två separata trådar kan inte manipulera samma objekt om du inte använder MFC-synkroniseringsklasserna och/eller lämpliga Win32-synkroniseringsobjekt, till exempel kritiska avsnitt. Mer information om kritiska avsnitt och andra relaterade objekt finns i Synkronisering i Windows SDK.

Klassbiblioteket använder kritiska avsnitt internt för att skydda globala datastrukturer, till exempel de som används av felsökningsminnesallokeringen.

Åtkomst till MFC-objekt från icke-MFC-trådar

Om du har ett flertrådat program som skapar en tråd på ett annat sätt än att använda ett CWinThread-objekt kan du inte komma åt andra MFC-objekt från tråden. Om du vill komma åt ett MFC-objekt från en sekundär tråd måste du med andra ord skapa tråden med någon av metoderna som beskrivs i Multithreading: Skapa User-Interface Trådar eller Multithreading: Skapa arbetstrådar. Dessa metoder är de enda som gör att klassbiblioteket kan initiera de interna variabler som krävs för att hantera flertrådade program.

Kartor över Windows-handtag

Som en allmän regel kan en tråd endast komma åt MFC-objekt som den skapade. Det beror på att tillfälliga och permanenta Windows-referenskartor lagras i trådlokal lagring för att skydda mot samtidig åtkomst från flera trådar. En arbetstråd kan till exempel inte utföra en beräkning och anropa sedan ett dokuments UpdateAllViews medlemsfunktion för att få fönstren som innehåller vyer för nya data ändrade. Detta har ingen effekt alls eftersom kartan från CWnd objekt till HWND:er är lokal för den primära tråden. Det innebär att en tråd kan ha en mappning från ett Windows-handtag till ett C++-objekt, men en annan tråd kan mappa samma handtag till ett annat C++-objekt. Ändringar som görs i den ena tråden återspeglas inte i den andra.

Det finns flera sätt att kringgå det här problemet. Det första är att skicka enskilda handtag (till exempel en HWND) istället för C++-objekt till arbetstråden. Arbetstråden lägger sedan till dessa objekt på den tillfälliga kartan genom att anropa lämplig FromHandle medlemsfunktion. Du kan också lägga till objektet i trådens permanenta karta genom att anropa Attach, men detta bör endast göras om du är säker på att objektet kommer att finnas längre än tråden.

En annan metod är att skapa nya användardefinierade meddelanden som motsvarar de olika uppgifter som dina arbetstrådar utför och publicera dessa meddelanden i programmets huvudfönster med hjälp av ::PostMessage. Den här kommunikationsmetoden liknar två olika program som konverderar, förutom att båda trådarna körs i samma adressutrymme.

Mer information om att hantera kartor finns i Technical Note 3. Mer information om lokal trådlagring finns i Trådlokal lagring och Använda trådlokal lagring i Windows SDK.

Kommunicera mellan trådar

MFC tillhandahåller ett antal klasser som gör att trådar kan synkronisera åtkomst till objekt för att upprätthålla trådsäkerheten. Användning av dessa klasser beskrivs i Multithreading: How to Use the Synchronization Classes and Multithreading: When to Use the Synchronization Classes (Så här använder du synkroniseringsklasserna och multitrådningsklasserna): När ska synkroniseringsklasserna användas. Mer information om dessa objekt finns i Synkronisering i Windows SDK.

Se även

Multitrådning med C++ och MFC