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


Многопоточные клиенты и дескрипторы контекста

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

Рассмотрим следующее: два клиентских потока вызывают удаленный вызов процедуры, который не изменяет состояние контекста (например, вызов просто получает из него некоторые значения). Такие вызовы не нужно сериализовать.

В таких ситуациях Windows XP предлагает модель сериализации в смешанном режиме, где каждый метод может быть объявлен как монопольный или общий доступ к дескриптору контекста. Дополнительные сведения см. в разделе context_handle_serialize и context_handle_noserialize .

В версиях Windows до Windows XP единственным средством одновременного доступа к дескрипторе контекста является вызов функции RpcSsDontSerializeContext , чтобы разрешить отправку нескольких вызовов в одном дескрипторе контекста. Вызов функции RpcSsDontSerializeContext не отключает сериализацию полностью; При выполнении контекста подпрограмма запуска контекста выполняется только после завершения всех незавершенных клиентских запросов. Вызов RpcScDontSerializeContext влияет на весь процесс и не может быть восстановлен. Использование RpcScDontSerializeContext в Windows XP и более поздних версиях не рекомендуется; Это делает серверный код очень сложным при надежной работе с состоянием гонки, присущим полностью несериализированным средам.