다음을 통해 공유


RpcSsContextLockExclusive 함수(rpcasync.h)

RpcSsContextLockExclusive 함수를 사용하면 애플리케이션이 단독 모드에서 컨텍스트 핸들 사용을 시작할 수 있습니다. RpcSsContextLockExclusive 함수를 사용하면 IDL 또는 ACF 파일에서 비저장(공유)로 선언된 메서드를 동적으로 변경하여 직렬화된(배타적) 모드에서 컨텍스트 핸들에 액세스할 수 있습니다.

구문

RPC_STATUS RpcSsContextLockExclusive(
  [in] RPC_BINDING_HANDLE ServerBindingHandle,
  [in] PVOID              UserContext
);

매개 변수

[in] ServerBindingHandle

클라이언트에 대한 바인딩을 나타내는 서버의 바인딩 핸들입니다. 서버는 이 핸들로 표시된 클라이언트를 가장합니다. 값이 0으로 지정된 경우 서버는 이 서버 스레드에서 제공하는 클라이언트를 가장합니다.

[in] UserContext

RPC에서 관리자 또는 서버 루틴에 전달된 포인터입니다. 설명 부분을 참조하세요.

아웃 전용 컨텍스트 핸들의 경우 RpcSsContextLockExclusive 함수는 작업을 수행하지 않습니다.

반환 값

실행이 성공하면 RPC_S_OK 반환합니다. 스레드가 이제 전용 모드에서 컨텍스트 핸들에 액세스할 수 있음을 나타냅니다. 여러 스레드가 컨텍스트 핸들에 대한 배타적 잠금을 시도할 때 ERROR_MORE_WRITES 반환합니다. 설명 부분을 참조하세요.

참고 유효한 오류 코드 목록은 RPC 반환 값을 참조하세요.
 

설명

컨텍스트 핸들이 직렬화되는지 아니면 비직렬화되는지를 수정하는 것은 실행 시 검색된 조건에 따라 컨텍스트 핸들을 닫을지 여부를 결정하는 애플리케이션에 유용할 수 있습니다. 컨텍스트 핸들을 직렬화된(배타적)에서 비저장(공유)로 변경하려면 RpcSsContextLockShared 함수를 사용합니다.

UserContext 매개 변수의 경우 관리자 루틴이 컨텍스트 핸들에 대한 포인터를 수신하는 경우 RPC에서 받은 것과 동일한 포인터로 RpcSsContextLockExclusive 함수를 전달해야 합니다. 관리자 루틴이 컨텍스트 핸들 자체를 수신하는 경우 이는 컨텍스트 핸들에만 일반적으로 적용되며, 컨텍스트 핸들 자체를 RpcSsContextLockExclusive 함수에 전달해야 합니다. 다음 코드 예제에서는 이를 보여 줍니다.

void _UseShared(
    /* [in] */ handle_t Binding,
    //...
    /* [in] */ TestContextHandleShared *Ctx,
    //...
    )
{
    //...
    RpcStatus = RpcSsContextLockExclusive(Binding, Ctx);
    //...
}

관리자 루틴이 여러 개의 [in, out] 컨텍스트 핸들을 인수로 사용하는 경우 RPC는 관리자 루틴에 컨텍스트 핸들 자체가 아닌 컨텍스트 핸들에 대한 포인터를 제공합니다. 포인터가 고유하도록 보장되므로 RpcSsContextLockExclusive 함수에 전달하는 것은 명확하지 않습니다. 그러나 함수가 여러 개의 [in] 전용 컨텍스트 핸들을 사용하는 경우 RPC는 관리자 루틴에 컨텍스트 핸들 자체를 제공합니다. 따라서 컨텍스트 핸들이 고유하지 않을 수 있습니다. 이 경우 RPC는 지정된 값을 사용하여 첫 번째 컨텍스트 핸들에서 이 함수를 실행합니다.

메서드는 공유 모드일 때 컨텍스트 핸들을 수정해서는 안 됩니다. RpcSsContextLockExclusive 함수를 호출해도 지정된 컨텍스트 핸들에 대한 판독기 잠금이 제거되지는 않습니다. 이렇게 하면 공유 모드에서 컨텍스트 핸들을 수정하지 않는 애플리케이션에 대한 변경되지 않은 컨텍스트 핸들이 보장됩니다. 두 스레드가 RpcSsContextLockExclusive 함수를 동시에 호출하여 동일한 컨텍스트 핸들에서 배타적 잠금을 가져오려고 하면 임의로 선택한 스레드 하나가 RPC_S_OK 반환되고 다른 스레드는 ERROR_MORE_WRITES 반환됩니다. ERROR_MORE_WRITES 반환되는 스레드는 배타적 잠금을 수신하지만 반환 시 컨텍스트 핸들에 대한 판독기 잠금이 손실됩니다. ERROR_MORE_WRITES 수신하는 호출자는 RpcSsContextLockExclusive 함수가 삭제되었을 수 있으므로 반환 시 컨텍스트 핸들에 대해 아무 것도 가정하지 않아야 합니다.

비동기 호출은 한 번에 둘 이상의 스레드에서 동일한 호출 개체에서 RpcSsContextLockExclusive 함수를 사용하면 안 됩니다.

RpcSsContextLockExclusive 함수는 메모리 부족 조건으로 인해 실패할 수 있으므로 RPC 서버는 이러한 오류를 처리할 준비가 되어 있어야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 rpcasync.h(Rpc.h 포함)
라이브러리 Rpcrt4.lib
DLL Rpcrt4.dll

추가 정보

RpcSsContextLockShared

context_handle

context_handle_noserialize

context_handle_serialize