上下文句柄的混合模式序列化

从 Windows XP 开始,单个接口可以同时容纳序列化和非序列化的上下文句柄,使接口上的一种方法能够访问以独占方式 (序列化) 的上下文句柄,而其他方法在共享模式下访问该上下文句柄 (非序列化) 。 有关上下文句柄的详细信息,请参阅以下属性:

序列化和共享模式访问功能与读/写锁定机制相当;使用序列化上下文句柄的方法是独占用户 (编写器) ,而使用非序列化上下文句柄的方法是共享用户 (读取者) 。 必须序列化销毁或修改上下文句柄状态的方法。 不修改上下文句柄状态的方法(例如那些只是从上下文句柄读取的方法)可以进行非序列化。 在混合模式下使用上下文句柄可以显著提高服务器的可伸缩性,尤其是当多个线程同时调用同一上下文句柄时。

RPC 不会在共享模式下使用上下文句柄的方法上强制实施“写入锁定”,这意味着应用程序必须确保不修改共享模式上下文句柄。 修改在共享模式下使用的上下文句柄可能会导致上下文句柄内容的细微损坏,这是无法调试的。

更改上下文句柄的序列化逻辑仅影响服务器。 此外,更改上下文句柄的序列化逻辑不会影响线路格式,因此,更改服务器上的序列化逻辑不会影响现有客户端与服务器交互的能力。

不建议仅使用非序列化上下文句柄。 使用非序列化句柄的服务器应切换到关闭上下文句柄的方法的序列化访问。

仅 [out]-的上下文句柄通常由创建方法使用,不需要任何序列化。 因此,RPC 将忽略应用于[out]-only 上下文句柄的任何序列化属性,例如 context_handle_serializecontext_handle_noserialize

注意

创建方法是隐式序列化的。

 

示例

以下两个示例演示如何启用上下文句柄的混合模式序列化。

第一个示例演示如何在 IDL 文件中执行此操作:

typedef [context_handle] void *TestContextHandleExclusive;
typedef [context_handle] TestContextHandleExclusive TestContextHandleShared;

void
UseShared(...
          [in] TestContextHandleShared *Ctx,
          ...);

void
UseExclusive(...
             [in, out] TestContextHandleExclusive *Ctx,
             ...);

第二个示例演示如何在 ACF 文件中启用上下文句柄的混合模式序列化:

typedef [context_handle_serialize] TestContextHandleExclusive;

typedef [context_handle_noserialize] TestContextHandleShared;

context_handle

context_handle_serialize

context_handle_noserialize