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

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

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

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

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