다음을 통해 공유


IThreadProxy 구조체

실행 스레드에 대한 추상화입니다. 직접 만든 스케줄러의 SchedulerType 정책 키에 따라 리소스 관리자는 일반 Win32 스레드 또는 UMS(사용자 모드 예약 가능) 스레드 중 하나에서 지원되는 스레드 프록시를 부여합니다. UMS 스레드는 Windows 7 이상 버전의 64비트 운영 체제에서 지원됩니다.

구문

struct IThreadProxy;

멤버

공용 메서드

이름 설명
IThreadProxy::GetId 스레드 프록시에 대한 고유 식별자를 반환합니다.
IThreadProxy::SwitchOut 내부 가상 프로세서 루트에서 컨텍스트의 연결을 끊습니다.
IThreadProxy::SwitchTo 현재 실행 중인 컨텍스트에서 다른 컨텍스트로의 협조적 컨텍스트 전환을 수행합니다.
IThreadProxy::YieldToSystem 호출 스레드가 현재 프로세서에서 실행할 준비가 되어 있는 다른 스레드에 실행 명령을 내리도록 합니다. 운영 체제는 실행할 다음 스레드를 선택합니다.

설명

스레드 프록시는 작업을 디스패치하는 수단으로 인터페이스 IExecutionContext 가 나타내는 실행 컨텍스트에 결합됩니다.

상속 계층 구조

IThreadProxy

요구 사항

헤더: concrtrm.h

네임스페이스: 동시성

IThreadProxy::GetId 메서드

스레드 프록시에 대한 고유 식별자를 반환합니다.

virtual unsigned int GetId() const = 0;

Return Value

고유한 정수 식별자입니다.

IThreadProxy::SwitchOut 메서드

내부 가상 프로세서 루트에서 컨텍스트의 연결을 끊습니다.

virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;

매개 변수

switchState
스위치를 실행하는 스레드 프록시의 상태를 나타냅니다. 매개 변수는 형식 SwitchingProxyState입니다.

설명

어떠한 이유로든 실행 중인 가상 프로세서 루트에서 컨텍스트 연결을 끊어야 할 경우 SwitchOut을 사용합니다. switchState 매개변수에 전달하는 값에 따라 그리고 가상 프로세서 루트에서 실행하는지 여부에 따라 이 호출은 해당 컨텍스트와 연결된 스레드 프록시를 즉시 반환하거나 차단합니다. 매개 변수를 SwitchOut로 설정하여 Idle을 호출하면 오류가 발생합니다. 이렇게 하면 invalid_argument 예외가 발생합니다.

SwitchOut은 리소스 관리자의 지시에 따라 또는 일시적으로 초과 구독된 가상 프로세서 루트를 요청했는데 그러한 요청이 처리되어 스케줄러의 가상 프로세서 루트 수를 줄이고자 할 때 유용합니다. 이 경우 매개 변수 switchState 를 로 설정Blocking하여 호출하기 전에 가상 프로세서 루트에서 IVirtualProcessorRoot::Remove 메서드SwitchOut 호출해야 합니다. 이렇게 하면 스레드 프록시가 차단되고, 스케줄러의 다른 가상 프로세서 루트에서 실행할 수 있을 때 실행이 다시 시작됩니다. 이 스레드 프록시의 실행 컨텍스트로 전환하기 위해 함수 SwitchTo 를 호출하여 차단 스레드 프록시를 다시 시작합니다. 연결된 컨텍스트를 사용하여 가상 프로세서 루트를 활성화하여 스레드 프록시를 다시 시작할 수도 있습니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 IVirtualProcessorRoot::Activate를 참조하세요.

또한 SwitchOut은 스레드 프록시를 차단하거나, 스레드 프록시가 실행 중인 가상 프로세서 루트와 스레드 프록시를 디스패칭하는 스케줄러에서 일시적으로 연결을 끊는 동안 나중에 활성화될 수 있도록 가상 프로세서를 다시 초기화하려 할 때도 사용할 수 있습니다. 스레드 프록시를 차단하려는 경우 SwitchOut 매개 변수를 switchState으로 설정하여 Blocking을 사용합니다. 위에서 언급했듯이 SwitchTo 또는 IVirtualProcessorRoot::Activate을 사용하여 나중에 다시 시작할 수 있습니다. 이 스레드 프록시가 실행 중인 가상 프로세서 루트 및 가상 프로세서가 연결된 스케줄러에서 일시적으로 스레드 프록시의 연결을 끊으려면 매개 변수를 SwitchOut으로 설정하여 Nesting을 사용합니다. 가상 프로세서 루트에서 실행 중일 때 SwitchOut 매개 변수를 switchState으로 설정하여 Nesting을 호출하면 루트가 다시 초기화되고 현재 스레드 프록시가 다른 루트를 필요로 하지 않고 계속 실행됩니다. 스레드 프록시는 이후 시점에서 IThreadProxy::SwitchOut 메서드 Blocking 를 호출할 때까지 스케줄러를 떠난 것으로 간주됩니다. 매개 변수를 SwitchOut으로 설정하여 Blocking을 두 번째로 호출하는 목적은, 컨텍스트를 차단된 상태로 돌려서 SwitchTo 또는 컨텍스트 연결을 끊은 스케줄러의 IVirtualProcessorRoot::Activate에 의해 다시 시작될 수 있도록 하는 것입니다. 컨텍스트는 가상 프로세서 루트에서 실행되고 있지 않았기 때문에 다시 초기화가 수행되지 않습니다.

다시 초기화된 가상 프로세서 루트는 리소스 관리자가 스케줄러를 부여한 새로운 가상 프로세서 루트와 차이가 없습니다. 이는 IVirtualProcessorRoot::Activate를 사용하여 실행 컨텍스트로 가상 프로세서 루트를 활성화함으로써 실행하는 데 사용할 수 있습니다.

SwitchOut 는 현재 실행 중인 스레드를 나타내는 인터페이스에서 IThreadProxy 호출되어야 합니다. 그렇지 않으면 결과가 정의되지 않습니다.

Visual Studio 2010과 함께 제공된 헤더 및 라이브러리에서 이 메서드는 매개 변수를 사용하지 않으며 가상 프로세서 루트를 다시 초기화하지 않습니다. 이전 동작을 유지하기 위해 Blocking의 기본 매개 변수 값이 제공됩니다.

IThreadProxy::SwitchTo 메서드

현재 실행 중인 컨텍스트에서 다른 컨텍스트로의 협조적 컨텍스트 전환을 수행합니다.

virtual void SwitchTo(
    _Inout_ IExecutionContext* pContext,
    SwitchingProxyState switchState) = 0;

매개 변수

pContext
협조적으로 전환할 실행 컨텍스트입니다.

switchState
스위치를 실행하는 스레드 프록시의 상태를 나타냅니다. 매개 변수는 형식 SwitchingProxyState입니다.

설명

이 메서드를 사용하여 첫 번째 실행 컨텍스트의 IExecutionContext::D ispatch 메서드에서 한 실행 컨텍스트에서 다른 실행 컨텍스트로 전환합니다. 이 메서드는 실행 컨텍스트 pContext 를 스레드 프록시와 연결하지 않은 경우 연결합니다. 현재 스레드 프록시의 소유권은 인수에 대해 지정한 값에 switchState 따라 결정됩니다.

현재 실행 중인 스레드 프록시를 Resource Manager에 반환하려는 경우 이 값을 Idle 사용합니다. 매개 변수 switchState 를 설정하여 Idle 호출 SwitchTo 하면 실행 컨텍스트 pContext 가 기본 실행 리소스에서 실행하기 시작합니다. 이 스레드 프록시의 소유권은 Resource Manager로 전송되며 전송을 완료하기 위해 반환 직후 SwitchTo 실행 컨텍스트의 Dispatch 메서드에서 반환되어야 합니다. 스레드 프록시가 디스패치하는 실행 컨텍스트는 스레드 프록시에서 연결이 끊어지고 스케줄러는 스레드 프록시를 다시 사용하거나 적합한 대로 삭제할 수 있습니다.

이 스레드 프록시가 차단된 상태로 전환되도록 하려면 이 값을 Blocking 사용합니다. 매개 변수 switchState 를 설정하여 Blocking 호출 SwitchTo 하면 실행 컨텍스트 pContext 가 실행되기 시작하고 다시 시작될 때까지 현재 스레드 프록시를 차단합니다. 스케줄러는 스레드 프록시가 상태에 있을 때 스레드 프록시의 소유권을 유지합니다 Blocking . 이 스레드 프록시의 실행 컨텍스트로 전환하기 위해 함수 SwitchTo 를 호출하여 차단 스레드 프록시를 다시 시작합니다. 연결된 컨텍스트를 사용하여 가상 프로세서 루트를 활성화하여 스레드 프록시를 다시 시작할 수도 있습니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 IVirtualProcessorRoot::Activate를 참조하세요.

실행 중인 가상 프로세서 루트에서 이 스레드 프록시를 일시적으로 분리하고 작업을 디스패치하는 스케줄러에서 이 값을 Nesting 사용합니다. 매개 변수 switchState 를 설정하여 Nesting 호출 SwitchTo 하면 실행 컨텍스트 pContext 가 실행되고 현재 스레드 프록시도 가상 프로세서 루트 없이 계속 실행됩니다. 스레드 프록시는 나중에 IThreadProxy::SwitchOut 메서드를 호출할 때까지 스케줄러를 떠난 것으로 간주됩니다. 이 메서드는 IThreadProxy::SwitchOut 가상 프로세서 루트를 다시 예약할 수 있을 때까지 스레드 프록시를 차단할 수 있습니다.

SwitchTo 는 현재 실행 중인 스레드를 나타내는 인터페이스에서 IThreadProxy 호출되어야 합니다. 그렇지 않으면 결과가 정의되지 않습니다. 매개 변수 pContextinvalid_argument .로 설정된 NULL경우 함수가 throw됩니다.

IThreadProxy::YieldToSystem 메서드

호출 스레드가 현재 프로세서에서 실행할 준비가 되어 있는 다른 스레드에 실행 명령을 내리도록 합니다. 운영 체제는 실행할 다음 스레드를 선택합니다.

virtual void YieldToSystem() = 0;

설명

일반 Windows 스레드에서 지원되는 스레드 프록시에서 호출되는 경우 Windows YieldToSystem 함수 SwitchToThread와 똑같이 동작합니다. 그러나 UMS(사용자 모드 예약 가능) 스레드 SwitchToThread 에서 호출되는 경우 함수는 운영 체제가 아닌 사용자 모드 스케줄러로 실행할 다음 스레드를 선택하는 작업을 위임합니다. 시스템에서 다른 준비 스레드로 전환하는 데 필요한 효과를 얻으려면 .를 사용합니다 YieldToSystem.

YieldToSystem 는 현재 실행 중인 스레드를 나타내는 인터페이스에서 IThreadProxy 호출되어야 합니다. 그렇지 않으면 결과가 정의되지 않습니다.

참고 항목

concurrency 네임스페이스
IExecutionContext 구조체
IScheduler 구조체
IVirtualProcessorRoot 구조체