컨텍스트 핸들의 혼합 모드 직렬화

Windows XP부터 단일 인터페이스는 직렬화된 컨텍스트 핸들과 비직렬화된 컨텍스트 핸들을 모두 수용할 수 있으므로 인터페이스의 한 메서드가 컨텍스트 핸들에 단독으로 액세스(직렬화됨)하고 다른 메서드는 공유 모드(비저장형)에서 해당 컨텍스트 핸들에 액세스할 수 있습니다. 컨텍스트 핸들에 대한 자세한 내용은 다음 특성을 참조하세요.

직렬화 및 공유 모드 액세스 기능은 읽기/쓰기 잠금 메커니즘과 비슷합니다. serialize된 컨텍스트 핸들을 사용하는 메서드는 단독 사용자(기록기)인 반면, 비제어형 컨텍스트 핸들을 사용하는 메서드는 공유 사용자(판독기)입니다. 컨텍스트 핸들의 상태를 삭제하거나 수정하는 메서드를 serialize해야 합니다. 컨텍스트 핸들에서 단순히 읽는 메서드와 같이 컨텍스트 핸들의 상태를 수정하지 않는 메서드는 비직렬화될 수 있습니다. 혼합 모드에서 컨텍스트 핸들을 사용하면 특히 여러 스레드가 동일한 컨텍스트 핸들을 동시에 호출하는 경우 서버의 확장성이 크게 향상될 수 있습니다.

RPC는 공유 모드에서 컨텍스트 핸들을 사용하여 메서드에 "쓰기 잠금"을 적용하지 않습니다. 즉, 애플리케이션은 공유 모드 컨텍스트 핸들이 수정되지 않도록 해야 합니다. 공유 모드에서 사용되는 컨텍스트 핸들을 수정하면 컨텍스트 핸들 콘텐츠가 미묘하게 손상되어 디버그할 수 없습니다.

컨텍스트 핸들의 serialization 논리를 변경하면 서버에만 영향을 줍니다. 또한 컨텍스트 핸들의 serialization 논리를 변경해도 와이어 형식에는 영향을 주지 않으므로 서버의 serialization 논리 변경은 기존 클라이언트의 서버와 상호 작용하는 기능에 영향을 주지 않습니다.

비직렬화된 컨텍스트 핸들만 사용하는 것은 권장되지 않습니다. 비직렬화 핸들을 사용하는 서버는 컨텍스트 핸들을 닫는 메서드에 대해 직렬화된 액세스로 전환해야 합니다.

[out]-only인 컨텍스트 핸들은 일반적으로 생성 메서드에서 사용되며 serialization이 필요하지 않습니다. 따라서 context_handle_serialize 또는 context_handle_noserialize 같은 [out] 전용 컨텍스트 핸들에 적용된 serialization 특성은 RPC에서 무시됩니다.

참고

만들기 메서드는 암시적으로 직렬화됩니다.

 

예제

다음 두 예제에서는 컨텍스트 핸들의 혼합 모드 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;

context_handle

context_handle_serialize

context_handle_noserialize