Freigeben über


Multithread-Clients und Kontexthandles

Wenn Sie über einen Multithreadclient verfügen, in dem mehrere Threads dieselbe Kontexthandleinstanz verwenden, wird standardmäßig der Zugriff auf die Kontexthandleinstanz auf dem Server serialisiert. Dadurch wird der Server-Manager daran gehindert, sich vor einem anderen Thread desselben Clients zu schützen, der den Kontext ändert oder der Kontext ausgeführt wird, während ein Aufruf verteilt wird. In bestimmten Fällen kann sich die Serialisierung jedoch auf die Leistung auswirken.

Beachten Sie Folgendes: Zwei Clientthreads rufen einen Remoteprozeduraufruf auf, der den Status des Kontexts nicht ändert (z. B. ruft der Aufruf einfach einige Werte daraus ab). Solche Aufrufe müssen nicht serialisiert werden.

In solchen Situationen bietet Windows XP ein Serialisierungsmodell mit gemischtem Modus, bei dem jede Methode deklariert werden kann, um exklusiven oder freigegebenen Zugriff auf ein Kontexthandle zu haben. Weitere Informationen finden Sie unter context_handle_serialize und context_handle_noserialize.

In Versionen von Windows vor Windows XP besteht die einzige Möglichkeit, gleichzeitigen Zugriff auf ein Kontexthandle zuzulassen, darin, die RpcSsDontSerializeContext--Funktion aufzurufen, damit mehrere Aufrufe auf einem einzelnen Kontexthandle verteilt werden können. Das Aufrufen der RpcSsDontSerializeContext--Funktion deaktiviert die Serialisierung nicht vollständig; wenn eine Kontextausführung auftritt, wird die Kontextausführungsroutine nur ausgeführt, wenn alle ausstehenden Clientanforderungen abgeschlossen wurden. Ein Aufruf von RpcScDontSerializeContext wirkt sich auf den gesamten Prozess aus und kann nicht wiederhergestellt werden. Die Verwendung von RpcScDontSerializeContext- in Windows XP und höheren Versionen wird nicht empfohlen; Es macht Servercode sehr kompliziert, wenn es sich zuverlässig um Rennbedingungen handelt, die in vollständig nicht serialisierten Umgebungen enthalten sind.