RpcSsContextLockShared-Funktion (rpcasync.h)
Mit der RpcSsContextLockShared-Funktion kann eine Anwendung mit der Verwendung eines Kontexthandles im freigegebenen Modus beginnen.
Syntax
RPC_STATUS RpcSsContextLockShared(
[in] RPC_BINDING_HANDLE ServerBindingHandle,
[in] PVOID UserContext
);
Parameter
[in] ServerBindingHandle
Bindungshandle auf dem Server, der eine Bindung an einen Client darstellt. Der Server gibt die Identität des Clients an, der durch dieses Handle angegeben wird. Wenn der Wert 0 (null) angegeben wird, gibt der Server die Identität des Clients an, der von diesem Serverthread bereitgestellt wird.
[in] UserContext
Zeiger, der von RPC an die Manager- oder Serverroutine übergeben wird. Weitere Informationen finden Sie unter Hinweise.
Für nur [out]-Kontexthandles führt die RpcSsContextLockShared-Funktion keinen Vorgang aus.
Rückgabewert
Gibt bei erfolgreicher Ausführung RPC_S_OK zurück, was angibt, dass der Thread jetzt zugriff auf das Kontexthandle im freigegebenen Modus hat.
Hinweise
Das Ändern, ob ein Kontexthandle serialisiert oder nichtserialisiert ist, kann für Anwendungen nützlich sein, die bestimmen, ob ein Kontexthandle basierend auf den bei der Ausführung erkannten Bedingungen geschlossen werden soll. Verwenden Sie die RpcSsContextLockExclusive-Funktion , um ein Kontexthandle von nicht freigegeben in serialisiert (exklusiv) zu ändern.
Wenn die Managerroutine für den UserContext-Parameter einen Zeiger auf ein Kontexthandle empfängt, muss sie der RpcSsContextLockShared-Funktion denselben Zeiger übergeben, den sie von RPC empfangen hat. Wenn die Managerroutine das Kontexthandle selbst empfängt, was typisch für nur [in]-Kontexthandles ist, muss sie das Kontexthandle selbst an die RpcSsContextLockShared-Funktion übergeben. Im folgenden Codebeispiel wird dies veranschaulicht:
UseExclusive (..., /* [in] */ TestContextHandleExclusive *Ctx, ...)
{
...
// we decided that we're done changing the context handle exclusively
// and that we have extensive processing ahead - downgrade the exclusive
// lock to shared, and do the processing allowing other readers in
RpcSsContextLockShared (NULL, // use the explicit context
Ctx
);
...
}
Wenn eine Managerroutine mehrere [in, out]-Kontexthandles als Argument verwendet, gibt RPC der Managerroutine einen Zeiger auf das Kontexthandle, nicht auf das Kontexthandle selbst. Der Zeiger ist garantiert eindeutig, und daher ist die Übergabe an die RpcSsContextLockShared-Funktion eindeutig. Wenn eine Funktion jedoch nur mehrere [in]-Kontexthandles verwendet, gibt RPC der Managerroutine das Kontexthandle selbst. Daher ist das Kontexthandle möglicherweise nicht eindeutig. In diesem Fall führt RPC diese Funktion im ersten Kontexthandle mit dem angegebenen Wert aus.
Methoden sollten ein Kontexthandle nicht ändern, wenn sie sich im freigegebenen Modus befinden. Durch das Aufrufen der RpcSsContextLockShared-Funktion wird keine Writersperre für das angegebene Kontexthandle entfernt. Dadurch wird sichergestellt, dass das Kontexthandle nicht von einem anderen Thread geändert wird.
Asynchrone Aufrufe dürfen nicht die RpcSsContextLockShared-Funktion für dasselbe Aufrufobjekt aus mehreren Threads gleichzeitig verwenden.
Die RpcSsContextLockShared-Funktion kann aufgrund von Nicht-Arbeitsspeicher-Bedingungen fehlschlagen, und RPC-Server müssen daher darauf vorbereitet sein, solche Fehler zu behandeln.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | rpcasync.h (rpc.h einschließen) |
Bibliothek | Rpcrt4.lib |
DLL | Rpcrt4.dll |