Clientes multithreaded e identificadores de contexto

Quando você tem um cliente multithreaded onde vários threads estão usando a mesma instância de identificador de contexto, o acesso à instância de identificador de contexto é serializado no servidor por padrão. Isso evita que o gerenciador do servidor tenha que se proteger contra outro thread do mesmo cliente alterando o contexto ou o contexto ficando para baixo enquanto uma chamada é despachada. No entanto, em certos casos, a serialização pode afetar o desempenho.

Considere o seguinte: dois threads de cliente invocam uma chamada de procedimento remoto que não altera o estado do contexto (por exemplo, a chamada simplesmente obtém alguns valores dele). Essas chamadas não precisam ser serializadas.

Para tais situações, o Windows XP oferece um modelo de serialização de modo misto, onde cada método pode ser declarado como tendo acesso exclusivo ou compartilhado a um identificador de contexto. Consulte context_handle_serialize e context_handle_noserialize para obter detalhes.

Em versões do Windows anteriores ao Windows XP, o único meio de permitir acesso simultâneo a um identificador de contexto é chamar a função RpcSsDontSerializeContext para permitir que várias chamadas sejam despachadas em um único identificador de contexto. Chamar o função RpcSsDontSerializeContext não desabilita totalmente a serialização; Quando ocorre um esgotamento de contexto, a rotina de resumo de contexto é executada somente quando todas as solicitações pendentes do cliente foram concluídas. Uma chamada para RpcScDontSerializeContext afeta todo o processo e não é reversível. O uso RpcScDontSerializeContext no Windows XP e versões posteriores não é recomendado; Isso torna o código do servidor muito complicado ao lidar de forma confiável com condições de corrida inerentes a ambientes completamente não serializados.