Compartilhar via


Serialização de modo misto de identificadores de contexto

A partir do Windows XP, uma única interface pode acomodar identificadores de contexto serializados e não serializados, permitindo que um método em uma interface acesse um identificador de contexto exclusivamente (serializado), enquanto outros métodos acessam esse identificador de contexto no modo compartilhado (não serializado). Para obter mais informações sobre identificadores de contexto, consulte os seguintes atributos:

Os recursos de acesso serializado e compartilhado são comparáveis aos mecanismos de bloqueio de leitura/gravação; os métodos que usam um identificador de contexto serializado são usuários exclusivos (gravadores), enquanto os métodos que usam um identificador de contexto não inicializado são usuários compartilhados (leitores). Os métodos que destroem ou modificam o estado de um identificador de contexto devem ser serializados. Métodos que não modificam o estado de um identificador de contexto, como os métodos que simplesmente leem de um identificador de contexto, podem ser não sequenciados. Usar um identificador de contexto no modo misto pode melhorar substancialmente a escalabilidade de um servidor, especialmente quando vários threads fazem chamadas simultâneas para o mesmo identificador de contexto.

O RPC não impõe o "bloqueio de gravação" em métodos que usam um identificador de contexto no modo compartilhado, o que significa que os aplicativos devem garantir que os identificadores de contexto do modo compartilhado não sejam modificados. A modificação de um identificador de contexto usado no modo compartilhado pode resultar em corrupção sutil do conteúdo do identificador de contexto, que são impossíveis de depurar.

Alterar a lógica de serialização de um identificador de contexto afeta apenas o servidor. Além disso, alterar a lógica de serialização de um identificador de contexto não afeta o formato de transmissão e, portanto, as alterações na lógica de serialização em um servidor não afetam a capacidade dos clientes existentes de interagir com o servidor.

Não é recomendável usar apenas identificadores de contexto não inicializados. Os servidores que usam identificadores não sequenciados devem alternar para o acesso serializado para o método que fecha o identificador de contexto.

Identificadores de contexto que são [out]-only normalmente são usados por métodos de criação e não exigem nenhuma serialização. Portanto, qualquer atributo de serialização aplicado a identificadores de contexto [out]-only, como context_handle_serialize ou context_handle_noserialize, é ignorado pelo RPC.

Observação

Os métodos de criação são implicitamente serializados.

 

Exemplos

Os dois exemplos a seguir mostram como habilitar a serialização de modo misto de identificadores de contexto.

O primeiro exemplo mostra como fazer isso no arquivo IDL:

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

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

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

O segundo exemplo mostra como habilitar a serialização de modo misto de identificadores de contexto no arquivo ACF:

typedef [context_handle_serialize] TestContextHandleExclusive;

typedef [context_handle_noserialize] TestContextHandleShared;

context_handle

context_handle_serialize

context_handle_noserialize