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


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

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

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

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

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

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

Дескрипторы контекста, которые являются недоступными только для создания, обычно используются методами создания и не требуют сериализации. Поэтому любой атрибут сериализации, применяемый к маркерам контекста только для [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