rpcssContextLockShared 函数 (rpcasync.h)
RpcSsContextLockShared 函数使应用程序能够在共享模式下开始使用上下文句柄。
语法
RPC_STATUS RpcSsContextLockShared(
[in] RPC_BINDING_HANDLE ServerBindingHandle,
[in] PVOID UserContext
);
参数
[in] ServerBindingHandle
服务器上的绑定句柄,表示与客户端的绑定。 服务器模拟此句柄指示的客户端。 如果指定值零,服务器将模拟由此服务器线程提供服务的客户端。
[in] UserContext
由 RPC 传递给管理器或服务器例程的指针。 有关更多信息,请参见备注。
对于仅 [out] 上下文句柄, RpcSsContextLockShared 函数不执行任何操作。
返回值
成功执行后返回RPC_S_OK,指示线程现在有权访问共享模式下的上下文句柄。
注解
修改上下文句柄是序列化还是非序列化,对于根据执行时检测到的条件确定是否关闭上下文句柄的应用程序非常有用。 若要将上下文句柄从非序列化 (共享) 更改为序列化 (独占) ,请使用 RpcSsContextLockExclusive 函数。
对于 UserContext 参数,如果管理器例程收到指向上下文句柄的指针,则必须向 RpcSsContextLockShared 函数传递它从 RPC 接收的相同指针。 如果管理器例程接收上下文句柄本身(对于 [in] 仅上下文句柄而言很常见),则必须将上下文句柄本身传递给 RpcSsContextLockShared 函数。 下面的代码示例演示了这一点:
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
);
...
}
如果管理器例程采用多个 [in, out] 上下文句柄作为参数,则 RPC 会为管理器例程提供指向上下文句柄的指针,而不是上下文句柄本身。 确保指针是唯一的,因此,将其传递给 RpcSsContextLockShared 函数是明确的。 但是,如果函数仅采用多个 [in] 上下文句柄,则 RPC 会为管理器例程提供上下文句柄本身。 因此,上下文句柄可能不是唯一的。 在这种情况下,RPC 在具有给定值的第一个上下文句柄上执行此函数。
在共享模式下,方法不应修改上下文句柄。 调用 RpcSsContextLockShared 函数不会消除指定上下文句柄上的编写器锁;这可确保上下文句柄不会被另一个线程更改。
异步调用不得一次从多个线程对同一个调用对象使用 RpcSsContextLockShared 函数。
RpcSsContextLockShared 函数可能因内存不足而失败,因此 RPC 服务器必须准备好处理此类错误。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | rpcasync.h (包括 Rpc.h) |
Library | Rpcrt4.lib |
DLL | Rpcrt4.dll |