Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Multithreading-Anwendungen erfordern eine strengere Sorgfalt als Single-Thread-Anwendungen, um sicherzustellen, dass Operationen in der vorgesehenen Reihenfolge ausgeführt werden und dass Daten, auf die mehrere Threads zugreifen, nicht beschädigt werden. In diesem Thema werden die Methoden beschrieben, mit denen potenzielle Probleme bei der Programmierung von Multithreadanwendungen mit Microsoft Foundation Class Library (MFC) vermieden werden können.
Zugriff auf Objekte von mehreren Threads aus
MFC-Objekte sind nicht von sich aus thread-sicher. Zwei getrennte Threads können nicht dasselbe Objekt manipulieren, es sei denn, Sie verwenden die MFC-Synchronisationsklassen und/oder die entsprechenden Win32-Synchronisationsobjekte, wie z. B. kritische Abschnitte. Weitere Informationen über kritische Abschnitte und andere verwandte Objekte finden Sie unter Synchronization im Windows-SDK.
In der Klassenbibliothek werden kritische Abschnitte intern zum Schutz globaler Datenstrukturen verwendet. Diese Datenstrukturen werden z. B. von der Debugspeicherbelegung verwendet.
Zugriff auf MFC-Objekte von Nicht-MFC-Threads aus
Wenn Sie eine Multithread-Anwendung haben, die einen Thread auf eine andere Weise als mit einem CWinThread-Objekt erstellt, können Sie von diesem Thread aus nicht auf andere MFC-Objekte zugreifen. Mit anderen Worten: Wenn Sie von einem sekundären Thread aus auf ein MFC-Objekt zugreifen möchten, müssen Sie diesen Thread mit einer der Methoden erstellen, die in Multithreading: Erstellen von Benutzer-Interface-Threads oder Multithreading: Erstellen von Worker-Threads erklärt werden. Nur mithilfe dieser Methoden kann die Klassenbibliothek die internen Variablen initialisieren, die zur Behandlung von Multithreadanwendungen erforderlich sind.
Windows Handle-Zuordnungen
Grundsätzlich kann ein Thread nur auf die von ihm erstellten MFC-Objekte zugreifen. Der Grund hierfür ist, dass temporäre und permanente Windows-Handlezuordnungen im lokalen Threadspeicher verwaltet werden. Auf diese Weise soll der gleichzeitige Zugriff von mehreren Threads aus verhindert werden. Ein Arbeitsthread kann z. B. keine Berechnung durchführen und anschließend die UpdateAllViews-Memberfunktion eines Dokuments aufrufen, um die Fenster zu ändern, die Ansichten der neuen Daten enthalten. Dies hat keinerlei Auswirkungen, da die Zuordnung von CWnd-Objekten zu HWNDs nur für den primären Thread gilt. Dies bedeutet, dass ein bestimmter Thread möglicherweise eine Zuordnung eines Windows-Handles zu einem C++-Objekt aufweist, ein anderer Thread dasselbe Handle jedoch unter Umständen einem anderen C++-Objekt zuordnet. Änderungen, die in einem Thread vorgenommen wurden, werden in einem anderen Thread nicht widergespiegelt.
Es gibt verschiedene Methoden zur Umgehung dieses Problems: Die erste besteht darin, einzelne Handles (z. B. ein HWND) anstelle von C++-Objekten an den Worker-Thread zu übergeben. Der Arbeitsthread fügt anschließend diese Objekte seiner temporären Zuordnung hinzu, indem er die entsprechende FromHandle-Memberfunktion aufruft. Sie könnten das Objekt auch zur permanenten Map des Threads hinzufügen, indem Sie Attach aufrufen. Dies sollten Sie jedoch nur dann tun, wenn Sie sicher sind, dass das Objekt länger als der Thread existieren wird.
Eine andere Methode besteht darin, neue benutzerdefinierte Nachrichten zu erstellen, die den verschiedenen Aufgaben entsprechen, die Ihre Worker-Threads ausführen werden, und diese Nachrichten mit ::PostMessage an das Hauptfenster der Anwendung zu senden. Diese Kommunikationsmethode ist mit dem Informationsaustausch zwischen zwei Anwendungen vergleichbar; der Unterschied besteht darin, dass beide Threads im selben Adressbereich ausgeführt werden.
Weitere Informationen über Handle Maps finden Sie unter Technische Hinweis 3. Weitere Informationen über den Thread-Lokalspeicher finden Sie unter Thread-Lokalspeicher und Verwendung des Thread-Lokalspeichers im Windows-SDK.
Kommunikation zwischen Threads
MFC enthält eine Anzahl von Klassen, die es Threads ermöglichen, den Zugriff auf Objekte zu synchronisieren und so die Threadsicherheit aufrechtzuerhalten. Die Verwendung dieser Klassen wird in Multithreading: Vorgehensweise bei der Verwendung der Synchronisationsklassen und Multithreading: Wann Sie die Synchronisationsklassen verwenden sollten beschrieben. Weitere Informationen zu diesen Objekten finden Sie unter Synchronisierung im Windows-SDK.