Multithreading: Verwendung der MFC-Synchronisierungsklassen
Die mit MFC bereitgestellten Multithread-Klassen sind in zwei Kategorien unterteilt: Synchronisierungsobjekte (CSyncObject, CSemaphor, CMutex, CCriticalSection und CEvent) und Synchronisierungszugriffsobjekte (CMultiLock und CSingleLock).
Synchronisierungsklassen werden verwendet, wenn der Zugriff auf eine Ressource gesteuert werden muss, um die Integrität der Ressource sicherzustellen. Synchronisierungszugriffsklassen werden verwendet, um Zugriff auf diese kontrollierten Ressourcen zu erhalten. In diesem Thema wird beschrieben, wann jede Klasse verwendet werden soll.
Um zu ermitteln, welche Synchronisierungsklasse Sie verwenden sollten, stellen Sie die folgende Reihe von Fragen:
Muss die Anwendung warten, bis etwas passiert, bevor sie auf die Ressource zugreifen kann (z. B. müssen Daten von einem Kommunikationsport empfangen werden, bevor sie in eine Datei geschrieben werden kann)?
Wenn ja, verwenden Sie
CEvent
.Kann mehrere Threads innerhalb derselben Anwendung gleichzeitig auf diese Ressource zugreifen (z. B. ermöglicht Ihre Anwendung bis zu fünf Fenster mit Ansichten im selben Dokument)?
Wenn ja, verwenden Sie
CSemaphore
.Kann mehr als eine Anwendung diese Ressource verwenden (z. B. die Ressource befindet sich in einer DLL)?
Wenn ja, verwenden Sie
CMutex
.Wenn nein, verwenden Sie
CCriticalSection
.
CSyncObject
wird nie direkt verwendet. Dies ist die Basisklasse für die anderen vier Synchronisierungsklassen.
Beispiel 1: Verwenden von drei Synchronisierungsklassen
Als Beispiel wird eine Anwendung verwendet, in der eine verknüpfte Liste von Konten verwaltet wird. In dieser Anwendung können drei Konten in verschiedenen Fenstern untersucht werden, es kann jedoch nur jeweils ein Konto aktualisiert werden. Bei der Aktualisierung eines Kontos werden die aktualisierten Daten über das Netzwerk an ein Datenarchiv gesendet.
In dieser Beispielanwendung kommen alle drei Arten von Synchronisierungsklassen zum Einsatz. Da bis zu drei Konten gleichzeitig untersucht werden können, wird CSemaphore
der Zugriff auf drei Ansichtsobjekte beschränkt. Beim Versuch, ein viertes Konto anzuzeigen, wartet die Anwendung entweder, bis eines der ersten drei Fenster geschlossen wird, oder der Versuch schlägt fehl. Wenn ein Konto aktualisiert wird, wird CCriticalSection
von der Anwendung sichergestellt, dass jeweils nur ein Konto aktualisiert wird. Nachdem das Update erfolgreich war, signalisiert CEvent
es, was einen Thread freigibt, der darauf wartet, dass das Ereignis signalisiert wird. Dieser Thread sendet die neuen Daten an das Datenarchiv.
Beispiel 2: Verwenden von Synchronisierungszugriffsklassen
Die Auswahl der zu verwendenden Synchronisierungszugriffsklasse ist noch einfacher. Wenn ihre Anwendung nur den Zugriff auf eine einzelne kontrollierte Ressource betrifft, verwenden Sie CSingleLock
. Wenn sie Zugriff auf eine der verschiedenen kontrollierten Ressourcen benötigt, verwenden Sie CMultiLock
. In Beispiel 1 CSingleLock
wäre es verwendet worden, da jeweils nur eine Ressource benötigt wird.
Informationen zur Verwendung der Synchronisierungsklassen finden Sie unter Multithreading: Verwenden der Synchronisierungsklassen. Informationen zur Synchronisierung finden Sie unter "Synchronisierung " im Windows SDK. Informationen zur Multithreading-Unterstützung in MFC finden Sie unter Multithreading mit C++ und MFC.