Поделиться через


Сериализация дескрипторов контекста в смешанном режиме

Начиная с Windows XP, один интерфейс может вместить как сериализованные, так и несериализированные дескрипторы контекста, позволяя одному методу в интерфейсе обращаться исключительно к дескриптору контекста (сериализованному), а другие методы получают доступ к этой дескрипторной обработке контекста в общем режиме (несериализованном). Дополнительные сведения о дескрипторах контекста см. в следующих атрибутах:

Возможности доступа к сериализованному и общему режиму сравнимы с механизмами блокировки чтения и записи; методы, использующие дескриптор сериализованного контекста, являются эксклюзивными пользователями (средствами записи), а методы, использующие несериализированный дескриптор контекста, являются общими пользователями (средствами чтения). Методы, которые уничтожают или изменяют состояние дескриптора контекста, должны быть сериализованы. Методы, которые не изменяют состояние дескриптора контекста, например методы, которые просто считывают из дескриптора контекста, могут быть несериализированы. Использование дескриптора контекста в смешанном режиме может значительно повысить масштабируемость сервера, особенно если несколько потоков выполняют одновременные вызовы одного дескриптора контекста.

RPC не применяет "блокировку записи" для методов, использующих дескриптор контекста в общем режиме. Это означает, что приложения должны гарантировать, что дескрипторы контекста общего режима не изменяются. Изменение дескриптора контекста, используемого в общем режиме, может привести к незначительным повреждениям содержимого дескриптора контекста, которые невозможно отлаживать.

Изменение логики сериализации дескриптора контекста влияет только на сервер. Кроме того, изменение логики сериализации дескриптора контекста не влияет на формат провода, и, следовательно, изменения логики сериализации на сервере не влияют на возможности существующих клиентов взаимодействовать с сервером.

Не рекомендуется использовать только несериализованные дескрипторы контекста. Серверы, использующие несериализованные дескрипторы, должны переключиться на сериализованный доступ для метода, закрывающего дескриптор контекста.

Дескрипторы контекста, которые являются [out]-only, обычно используются методами создания и не требуют никакой сериализации. Поэтому любой атрибут сериализации, применяемый к дескрипторам контекста [out], таким как context_handle_serialize или context_handle_noserialize, игнорируется RPC.

Примечание

Методы создания неявно сериализуются.

 

Примеры

В следующих двух примерах показано, как включить сериализацию дескрипторов контекста в смешанном режиме.

В первом примере показано, как это сделать в 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