컨텍스트 핸들의 혼합 모드 직렬화
Windows XP부터 단일 인터페이스는 직렬화 및 비직렬화된 컨텍스트 핸들을 모두 수용할 수 있으므로 인터페이스의 한 메서드가 단독으로(직렬화됨) 컨텍스트 핸들에 액세스할 수 있도록 하는 반면, 다른 메서드는 공유 모드(비저장)에서 해당 컨텍스트 핸들에 액세스합니다. 컨텍스트 핸들에 대한 자세한 내용은 다음 특성을 참조하세요.
직렬화 및 공유 모드 액세스 기능은 읽기/쓰기 잠금 메커니즘과 비슷합니다. serialize된 컨텍스트 핸들을 사용하는 메서드는 단독 사용자(기록기)인 반면, 비직렬화 컨텍스트 핸들을 사용하는 메서드는 공유 사용자(읽기 권한자)입니다. 컨텍스트 핸들의 상태를 삭제하거나 수정하는 메서드는 serialize되어야 합니다. 컨텍스트 핸들에서 단순히 읽는 메서드와 같이 컨텍스트 핸들의 상태를 수정하지 않는 메서드는 비직렬화될 수 있습니다. 혼합 모드에서 컨텍스트 핸들을 사용하면 특히 여러 스레드가 동일한 컨텍스트 핸들을 동시에 호출하는 경우 서버의 확장성을 크게 향상시킬 수 있습니다.
RPC는 공유 모드에서 컨텍스트 핸들을 사용하여 메서드에 "쓰기 잠금"을 적용하지 않습니다. 즉, 애플리케이션은 공유 모드 컨텍스트 핸들이 수정되지 않도록 해야 합니다. 공유 모드에서 사용되는 컨텍스트 핸들을 수정하면 컨텍스트 핸들 내용이 미묘하게 손상되어 디버그할 수 없습니다.
컨텍스트 핸들의 serialization 논리를 변경하면 서버에만 영향을 줍니다. 또한 컨텍스트 핸들의 serialization 논리를 변경해도 와이어 형식에 영향을 주지 않으므로 서버의 serialization 논리를 변경해도 서버와 상호 작용하는 기존 클라이언트의 기능에는 영향을 주지 않습니다.
비직렬화 컨텍스트 핸들만 사용하는 것은 권장되지 않습니다. 비직렬화 핸들을 사용하는 서버는 컨텍스트 핸들을 닫는 메서드에 대한 직렬화된 액세스로 전환해야 합니다.
[out] 전용인 컨텍스트 핸들은 일반적으로 생성 메서드에서 사용되며 serialization이 필요하지 않습니다. 따라서 context_handle_serialize 또는 context_handle_noserialize같은 [out] 전용 컨텍스트 핸들에 적용된 serialization 특성은 RPC에서 무시됩니다.
메모
생성 메서드는 암시적으로 serialize됩니다.
예제
다음 두 예제에서는 컨텍스트 핸들의 혼합 모드 serialization을 사용하도록 설정하는 방법을 보여 줍니다.
첫 번째 예제에서는 IDL 파일에서 이 작업을 수행하는 방법을 보여줍니다.
typedef [context_handle] void *TestContextHandleExclusive;
typedef [context_handle] TestContextHandleExclusive TestContextHandleShared;
void
UseShared(...
[in] TestContextHandleShared *Ctx,
...);
void
UseExclusive(...
[in, out] TestContextHandleExclusive *Ctx,
...);
두 번째 예제에서는 ACF 파일에서 컨텍스트 핸들의 혼합 모드 serialization을 사용하도록 설정하는 방법을 보여 줍니다.
typedef [context_handle_serialize] TestContextHandleExclusive;
typedef [context_handle_noserialize] TestContextHandleShared;
관련 항목