Freigeben über


CreateSemaphoreW-Funktion (synchapi.h)

Erstellt oder öffnet ein benanntes oder unbenannte Semaphorobjekt.

Um ein Zugriffsformat für das Objekt anzugeben, verwenden Sie die CreateSemaphoreEx--Funktion.

Syntax

HANDLE CreateSemaphoreW(
  [in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  [in]           LONG                  lInitialCount,
  [in]           LONG                  lMaximumCount,
  [in, optional] LPCWSTR               lpName
);

Parameter

[in, optional] lpSemaphoreAttributes

Ein Zeiger auf eine SECURITY_ATTRIBUTES Struktur. Wenn dieser Parameter NULL-ist, kann das Handle nicht von untergeordneten Prozessen geerbt werden.

Der lpSecurityDescriptor Element der Struktur gibt einen Sicherheitsdeskriptor für das neue Semaphor an. Wenn dieser Parameter NULL-ist, erhält der Semaphor einen Standardsicherheitsdeskriptor. Die ACLs im Standardsicherheitsdeskriptor für ein Semaphor stammen aus dem primären oder Identitätswechseltoken des Erstellers.

[in] lInitialCount

Die anfängliche Anzahl des Semaphorobjekts. Dieser Wert muss größer oder gleich Null und kleiner als oder gleich lMaximumCountsein. Der Zustand eines Semaphors wird signalisiert, wenn seine Anzahl größer als Null und nicht signalisiert ist, wenn es null ist. Die Anzahl wird um eine verringert, wenn eine Wartefunktion einen Thread freigibt, der auf das Semaphor wartete. Die Anzahl wird um einen angegebenen Betrag erhöht, indem die ReleaseSemaphore--Funktion aufgerufen wird.

[in] lMaximumCount

Die maximale Anzahl für das Semaphorobjekt. Dieser Wert muss größer als Null sein.

[in, optional] lpName

Der Name des Semaphorobjekts. Der Name ist auf MAX_PATH Zeichen beschränkt. Bei dem Namensvergleich wird die Groß-/Kleinschreibung beachtet.

Wenn lpName mit dem Namen eines vorhandenen benannten Semaphorobjekts übereinstimmt, fordert diese Funktion das SEMAPHORE_ALL_ACCESS Zugriffsrecht an. In diesem Fall werden die parameter lInitialCount und lMaximumCount ignoriert, da sie bereits durch den Erstellungsprozess festgelegt wurden. Wenn der lpSemaphoreAttributes Parameter nicht NULL-ist, bestimmt er, ob das Handle geerbt werden kann, aber sein Sicherheitsdeskriptorelement wird ignoriert.

Wenn lpName-NULL-ist, wird das Semaphorobjekt ohne Namen erstellt.

Wenn lpName- mit dem Namen eines vorhandenen Ereignisses, mutex- oder wartezeitfähigen Timer-, Auftrags- oder Dateizuordnungsobjekts übereinstimmt, schlägt die Funktion fehl, und die GetLastError--Funktion gibt ERROR_INVALID_HANDLEzurück. Dies geschieht, da diese Objekte denselben Namespace gemeinsam nutzen.

Der Name kann ein Präfix "Global" oder "Local" aufweisen, um das Objekt explizit im globalen oder Sitzungsnamespace zu erstellen. Der Rest des Namens kann ein beliebiges Zeichen mit Ausnahme des umgekehrten Schrägstrichs (\) enthalten. Weitere Informationen finden Sie unter Kernel Object Namespaces. Schnelle Benutzerumschaltung wird mithilfe von Terminaldienstesitzungen implementiert. Kernelobjektnamen müssen den Richtlinien für Terminaldienste entsprechen, damit Anwendungen mehrere Benutzer unterstützen können.

Das Objekt kann in einem privaten Namespace erstellt werden. Weitere Informationen finden Sie unter Object Namespaces.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle für das Semaphorobjekt. Wenn das benannte Semaphorobjekt vor dem Funktionsaufruf vorhanden ist, gibt die Funktion ein Handle an das vorhandene Objekt zurück und GetLastError gibt ERROR_ALREADY_EXISTSzurück.

Wenn die Funktion fehlschlägt, ist der Rückgabewert NULL-. Rufen Sie GetLastErrorauf, um erweiterte Fehlerinformationen zu erhalten.

Bemerkungen

Der von CreateSemaphore zurückgegebene Handle hat das SEMAPHORE_ALL_ACCESS Zugriffsrecht; es kann in jeder Funktion verwendet werden, die ein Handle für ein Semaphorobjekt erfordert, vorausgesetzt, der Aufrufer wurde Zugriff gewährt. Wenn ein Semaphor aus einem Dienst oder einem Thread erstellt wird, der die Identität eines anderen Benutzers angibt, können Sie entweder einen Sicherheitsdeskriptor auf das Semaphor anwenden, wenn Sie es erstellen, oder den Standardsicherheitsdeskriptor für den Erstellungsprozess ändern, indem Sie die standardmäßige DACL ändern. Weitere Informationen finden Sie unter Sync Object Security and Access Rights.

Der Zustand eines Semaphorobjekts wird signalisiert, wenn seine Anzahl größer als Null ist und nicht signalisiert wird, wenn die Anzahl gleich Null ist. Der parameter lInitialCount gibt die anfangsanzahl an. Die Anzahl darf niemals kleiner als Null oder größer als der im lMaximumCount Parameter angegebene Wert sein.

Jeder Thread des aufrufenden Prozesses kann das Semaphor-Objekthandle in einem Aufruf einer der Wait-Funktionenangeben. Die Einzelobjekt-Wait-Funktionen werden zurückgegeben, wenn der Status des angegebenen Objekts signalisiert wird. Die Wait-Funktionen mit mehreren Objekten können angewiesen werden, entweder zurückzugeben, wenn eines oder alle angegebenen Objekte signalisiert werden. Wenn eine Wartefunktion zurückgegeben wird, wird der Wartethread losgelassen, um die Ausführung fortzusetzen. Jedes Mal, wenn ein Thread eine Wartezeit für ein Semaphorobjekt abschließt, wird die Anzahl des Semaphorobjekts um ein Objekt erhöht. Wenn der Thread abgeschlossen ist, ruft er die ReleaseSemaphor--Funktion auf, wodurch die Anzahl des Semaphorobjekts erhöht wird.

Mehrere Prozesse können Überhandles desselben Semaphorobjekts verfügen, wodurch die Verwendung des Objekts für die Interprocesssynchronisierung ermöglicht wird. Die folgenden Objektfreigabemechanismen sind verfügbar:

  • Ein untergeordneter Prozess, der von der CreateProcess--Funktion erstellt wird, kann ein Handle an ein Semaphorobjekt erben, wenn die lpSemaphoreAttributes Parameter von CreateSemaphore aktivierte Vererbung.
  • Ein Prozess kann das Semaphor-Objekthandle in einem Aufruf der DuplicateHandle--Funktion angeben, um ein dupliziertes Handle zu erstellen, das von einem anderen Prozess verwendet werden kann.
  • Ein Prozess kann den Namen eines Semaphorobjekts in einem Aufruf des OpenSemaphors oder CreateSemaphore--Funktion angeben.
Verwenden Sie die CloseHandle--Funktion, um den Handle zu schließen. Das System schließt das Handle automatisch, wenn der Prozess beendet wird. Das Semaphorobjekt wird zerstört, wenn der letzte Griff geschlossen wurde.

Beispiele

Ein Beispiel, das CreateSemaphoreverwendet, finden Sie unter Verwenden von Semaphor-Objekten.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header- synchapi.h (enthalten Windows.h)
Library Kernel32.lib
DLL- Kernel32.dll

Siehe auch

CloseHandle-

CreateProcess-

CreateSemaphoreEx-

DuplicateHandle-

Objektnamen

ReleaseSemaphor-

SECURITY_ATTRIBUTES

Semaphor-Objekte

Synchronisierungsfunktionen