Многопоточные клиенты и дескрипторы контекста
Если у вас есть многопоточный клиент, в котором несколько потоков используют один и тот же экземпляр дескриптора контекста, доступ к экземпляру дескриптора контекста сериализуется на сервере по умолчанию. Это позволяет диспетчеру серверов не защищаться от другого потока от того же клиента, изменяющего контекст или контекст, запущенный во время отправки вызова. Однако в некоторых случаях сериализация может повлиять на производительность.
Рассмотрим следующее: два клиентских потока вызывают удаленный вызов процедуры, который не изменяет состояние контекста (например, вызов просто получает некоторые значения из него). Такие вызовы не нужно сериализовать.
В таких ситуациях Windows XP предлагает модель сериализации в смешанном режиме, где каждый метод может быть объявлен монопольным или общим доступом к дескриптору контекста. Дополнительные сведения см. в context_handle_serialize и context_handle_noserialize.
В версиях Windows до Windows XP единственный способ разрешить одновременный доступ к дескриптору контекста — вызвать функцию RpcSsDontSerializeContext, чтобы разрешить отправку нескольких вызовов в одном дескрипторе контекста. Вызов функции RpcSsDontSerializeContext не полностью отключает сериализацию; При выполнении контекста выполняется подпрограмма запуска контекста, только если все невыполненные клиентские запросы завершены. Вызов RpcScDontSerializeContext влияет на весь процесс и не возвращается. Использование RpcScDontSerializeContext в Windows XP и более поздних версиях не рекомендуется; это делает код сервера очень сложным при работе с условиями гонки, присущими полностью несериализированным средам.