다중 스레드 클라이언트 및 컨텍스트 핸들

여러 스레드가 동일한 컨텍스트 핸들 instance 사용하는 다중 스레드 클라이언트가 있는 경우 컨텍스트 핸들 instance 대한 액세스는 기본적으로 서버에서 직렬화됩니다. 이렇게 하면 호출이 디스패치되는 동안 컨텍스트 또는 실행 중인 컨텍스트를 변경하는 동일한 클라이언트에서 다른 스레드로부터 서버 관리자를 보호하지 않아도 됩니다. 그러나 경우에 따라 직렬화가 성능에 영향을 미칠 수 있습니다.

다음을 고려합니다. 두 클라이언트 스레드는 컨텍스트의 상태를 변경하지 않는 원격 프로시저 호출을 호출합니다(예: 호출은 단순히 일부 값을 가져옵니다). 이러한 호출은 직렬화할 필요가 없습니다.

이러한 경우 Windows XP는 혼합 모드 직렬화 모델을 제공하며, 각 메서드는 컨텍스트 핸들에 대한 배타적 또는 공유 액세스 권한이 있다고 선언할 수 있습니다. 자세한 내용은 context_handle_serializecontext_handle_noserialize 참조하세요.

Windows XP 이전 버전의 Windows에서는 컨텍스트 핸들에 대한 동시 액세스를 허용하는 유일한 방법은 RpcSsDontSerializeContext 함수를 호출하여 단일 컨텍스트 핸들에서 여러 호출을 디스패치할 수 있도록 하는 것입니다. RpcSsDontSerializeContext 함수를 호출해도 serialization이 완전히 비활성화되지는 않습니다. 컨텍스트 런다운이 발생하면 모든 미해결 클라이언트 요청이 완료된 경우에만 컨텍스트 런다운 루틴이 실행됩니다. RpcScDontSerializeContext에 대한 호출은 전체 프로세스에 영향을 미치며 되돌릴 수 없습니다. Windows XP 이상 버전에서는 RpcScDontSerializeContext 를 사용하지 않는 것이 좋습니다. 완전히 직렬화되지 않은 환경에 내재된 경합 조건을 안정적으로 처리할 때 서버 코드를 매우 복잡하게 만듭니다.