Synchronisierungsobjekte
Ein Synchronisierungsobjekt ist ein Objekt, dessen Handle in einer der Wartefunktionen angegeben werden kann, um die Ausführung mehrerer Threads zu koordinieren. Mehrere Prozesse können ein Handle für dasselbe Synchronisierungsobjekt haben, wodurch eine prozessübergreifende Synchronisierung möglich ist.
Die folgenden Objekttypen werden ausschließlich für die Synchronisierung bereitgestellt.
| type | BESCHREIBUNG |
|---|---|
| Ereignis | Benachrichtigt einen oder mehrere wartende Threads über das Eintreten eines Ereignisses. Weitere Informationen finden Sie unter Ereignisobjekte. |
| Mutex | Kann immer nur einem Thread gleichzeitig gehören, sodass Threads den gegenseitig ausschließenden Zugriff auf eine freigegebene Ressource koordinieren können. Weitere Informationen finden Sie unter Mutex Objects. |
| Semaphore | Behält eine Anzahl zwischen 0 (null) und einem bestimmten Maximalwert bei und beschränkt die Anzahl von Threads, die gleichzeitig auf eine freigegebene Ressource zugreifen. Weitere Informationen finden Sie unter Semaphore Objects. |
| Wartebarer Timer | Benachrichtigt einen oder mehrere wartende Threads, dass eine angegebene Zeit eingetroffen ist. Weitere Informationen finden Sie unter Waitable Timer Objects. |
Die folgenden Objekte sind zwar für andere Verwendungszwecke verfügbar, können aber auch für die Synchronisierung verwendet werden.
| Object | BESCHREIBUNG |
|---|---|
| Änderungsbenachrichtigung | Der von der FindFirstChangeNotification-Funktion erstellte Zustand wird auf signalisiert festgelegt, wenn ein angegebener Änderungstyp innerhalb eines angegebenen Verzeichnisses oder einer angegebenen Verzeichnisstruktur auftritt. Weitere Informationen finden Sie unter Abrufen von Verzeichnisänderungsbenachrichtigungen. |
| Konsoleneingabe | Wird erstellt, wenn eine Konsole erstellt wird. Das Handle für die Konsoleneingabe wird von der CreateFile-Funktion zurückgegeben, wenn CONIN$ angegeben wird, oder von der GetStdHandle-Funktion. Sein Zustand wird auf signalisiert festgelegt, wenn ungelesene Eingaben im Eingabepuffer der Konsole und auf nicht signalisiert festgelegt sind, wenn der Eingabepuffer leer ist. Weitere Informationen zu Konsolen finden Sie unter Zeichenmodusanwendungen. |
| Auftrag | Erstellt durch Aufrufen der CreateJobObject-Funktion. Der Status eines Auftragsobjekts wird auf signalisiert festgelegt, wenn alle prozesse beendet werden, weil das angegebene Zeitlimit für das Ende des Auftrags überschritten wurde. Weitere Informationen zu Auftragsobjekten finden Sie unter Auftragsobjekte. |
| Benachrichtigung über Arbeitsspeicherressourcen | Wird von der CreateMemoryResourceNotification-Funktion erstellt. Sein Zustand wird auf signalisiert festgelegt, wenn ein angegebener Änderungstyp im physischen Speicher auftritt. Weitere Informationen zum Arbeitsspeicher finden Sie unter Speicherverwaltung. |
| Prozess | Erstellt durch Aufrufen der CreateProcess-Funktion. Sein Zustand wird auf nicht signalisiert festgelegt, während der Prozess ausgeführt wird, und auf signalisiert, wenn der Prozess beendet wird. Weitere Informationen zu Prozessen finden Sie unter Prozesse und Threads. |
| Thread | Wird erstellt, wenn ein neuer Thread erstellt wird, indem die CreateProcess-, CreateThread-oder CreateRemoteThread-Funktion aufgerufen wird. Sein Zustand wird auf nicht signalisiert festgelegt, während der Thread ausgeführt wird, und auf signalisiert, wenn der Thread beendet wird. Weitere Informationen zu Threads finden Sie unter Prozesse und Threads. |
In einigen Fällen können Sie auch eine Datei, eine Named Pipe oder ein Kommunikationsgerät als Synchronisierungsobjekt verwenden. von der Verwendung zu diesem Zweck wird jedoch abgeraten. Verwenden Sie stattdessen asynchrone E/A, und warten Sie auf das Ereignisobjekt, das in der OVERLAPPED-Struktur festgelegt ist. Es ist sicherer, das Ereignisobjekt zu verwenden, da es zu Verwechslungen kommen kann, wenn mehrere gleichzeitig überlappende Vorgänge für dieselbe Datei, Named Pipe oder ein Kommunikationsgerät ausgeführt werden. In dieser Situation gibt es keine Möglichkeit zu wissen, welcher Vorgang dazu führte, dass der Zustand des Objekts signalisiert wurde.
Weitere Informationen zu E/A-Vorgängen für Dateien, Named Pipes oder Kommunikation finden Sie unter Synchronisierung und überlappende Ein- und Ausgabe.