多线程客户端和上下文句柄

如果有多个线程使用同一上下文句柄实例的多线程客户端,则默认情况下会在服务器上序列化对上下文句柄实例的访问。 这样,服务器管理器就不必防范来自同一客户端的另一个线程,从而在调度调用时更改上下文或上下文运行。 但是,在某些情况下,序列化可能会影响性能。

请考虑以下事项:两个客户端线程调用不更改上下文状态的远程过程调用(例如,调用只是从中获取一些值)。 不需要序列化此类调用。

在这种情况下,Windows XP 提供了混合模式序列化模型,其中每个方法都可以声明为具有对上下文句柄的独占或共享访问权限。 有关详细信息,请参阅 context_handle_serializecontext_handle_noserialize

在 Windows XP 之前的 Windows 版本中,允许对上下文句柄进行并发访问的唯一方式是调用 RpcSsDontSerializeContext 函数,以允许在单个上下文句柄上调度多个调用。 调用 RpcSsDontSerializeContext 函数不会完全禁用序列化;当发生上下文运行时,上下文运行例程仅在所有未完成的客户端请求完成时才运行。 调用 RpcScDontSerializeContext 会影响整个过程,并且不可还原。 不建议在 Windows XP 及更高版本中使用 RpcScDontSerializeContext;当可靠地处理完全非序列化环境中固有的争用条件时,它会使服务器代码变得非常复杂。