Context 클래스
실행 컨텍스트에 대한 추상화를 나타냅니다.
구문
class Context;
멤버
보호된 생성자
속성 | 설명 |
---|---|
~컨텍스트 소멸자 |
공용 메서드
이름 | 설명 |
---|---|
Block | 현재 컨텍스트를 차단합니다. |
CurrentContext | 현재 컨텍스트에 대한 포인터를 반환합니다. |
GetId | 컨텍스트가 속한 스케줄러 내에서 고유한 컨텍스트의 식별자를 반환합니다. |
GetScheduleGroupId | 컨텍스트가 현재 작업 중인 일정 그룹의 식별자를 반환합니다. |
GetVirtualProcessorId | 컨텍스트가 현재 실행 중인 가상 프로세서의 식별자를 반환합니다. |
ID | 현재 컨텍스트가 속한 스케줄러 내에서 고유한 현재 컨텍스트에 대한 식별자를 반환합니다. |
IsCurrentTaskCollectionCanceling | 현재 컨텍스트에서 인라인으로 실행 중인 작업 컬렉션이 활성 취소 중인지 곧 실행될 것인지 여부를 나타내는 표시를 반환합니다. |
IsSynchronouslyBlocked | 컨텍스트가 동기적으로 차단되는지 여부를 확인합니다. 컨텍스트는 명시적으로 차단으로 이어지는 작업을 수행한 경우 동기적으로 차단된 것으로 간주됩니다. |
초과 구독 | 해당 스케줄러의 가상 프로세서 중 하나에서 실행되는 컨텍스트에서 호출될 때 코드 블록 기간 동안 스케줄러에 추가 가상 프로세서를 삽입합니다. |
ScheduleGroupId | 현재 컨텍스트가 작업 중인 일정 그룹의 식별자를 반환합니다. |
차단을 해제 | 컨텍스트의 차단을 해제하고 컨텍스트를 실행할 수 있게 합니다. |
VirtualProcessorId | 현재 컨텍스트가 실행 중인 가상 프로세서의 식별자를 반환합니다. |
Yield | 다른 컨텍스트에서 실행할 수 있도록 실행을 양도합니다. 양도할 수 있는 다른 컨텍스트가 없는 경우 스케줄러에서 다른 운영 체제 스레드에 양도할 수 있습니다. |
설명
동시성 런타임 스케줄러(Scheduler 참조)는 실행 컨텍스트를 사용하여 애플리케이션에서 큐에 대기 중인 작업을 실행합니다. Win32 스레드는 Windows 운영 체제에서 실행 컨텍스트의 예입니다.
언제든지 스케줄러의 동시성 수준은 Resource Manager에서 부여한 가상 프로세서 수와 같습니다. 가상 프로세서는 처리 리소스에 대한 추상화이며 기본 시스템의 하드웨어 스레드에 매핑됩니다. 지정된 시간에 단일 스케줄러 컨텍스트만 가상 프로세서에서 실행할 수 있습니다.
스케줄러는 본질적으로 협조적이며 실행 컨텍스트는 대기 상태로 들어가려는 경우 언제든지 가상 프로세서를 다른 컨텍스트로 만들 수 있습니다. 대기가 충족되면 스케줄러에서 사용 가능한 가상 프로세서가 실행을 시작할 때까지 다시 시작할 수 없습니다.
상속 계층 구조
Context
요구 사항
헤더: concrt.h
네임스페이스: 동시성
Block
현재 컨텍스트를 차단합니다.
static void __cdecl Block();
설명
이 메서드를 사용하면 현재 호출 컨텍스트와 연결된 스케줄러가 없는 경우 프로세스의 기본 스케줄러가 생성되고 호출 컨텍스트에 연결됩니다.
호출 컨텍스트가 가상 프로세서에서 실행 중인 경우 가상 프로세서는 실행할 다른 실행 가능한 컨텍스트를 찾거나 잠재적으로 새 컨텍스트를 만들 수 있습니다.
메서드가 Block
호출되었거나 호출된 후 다시 실행하려면 다른 실행 컨텍스트에서 Unblock 메서드에 대한 호출과 페어링해야 합니다. 코드가 메서드를 호출 Unblock
할 수 있는 다른 스레드의 컨텍스트를 게시하는 지점과 실제 메서드 호출 Block
이 이루어지는 지점 사이에는 중요한 기간이 있습니다. 이 기간 동안에는 잠금 가져오기 등과 같은 개별적인 이유로 차단하거나 차단 해제할 수 있는 메서드를 호출해서는 안 됩니다. 및 Unblock
메서드에 대한 호출은 Block
차단 및 차단 해제 이유를 추적하지 않습니다. 하나의 개체만 한 쌍의 소유권을 Block
- Unblock
가져야 합니다.
이 메서드는 scheduler_resource_allocation_error 포함하여 다양한 예외를 throw할 수 있습니다.
~문맥
virtual ~Context();
CurrentContext
현재 컨텍스트에 대한 포인터를 반환합니다.
static Context* __cdecl CurrentContext();
Return Value
현재 컨텍스트에 대한 포인터입니다.
설명
이 메서드를 사용하면 현재 호출 컨텍스트와 연결된 스케줄러가 없는 경우 프로세스의 기본 스케줄러가 생성되고 호출 컨텍스트에 연결됩니다.
GetId
컨텍스트가 속한 스케줄러 내에서 고유한 컨텍스트의 식별자를 반환합니다.
virtual unsigned int GetId() const = 0;
Return Value
컨텍스트가 속한 스케줄러 내에서 고유한 컨텍스트의 식별자입니다.
GetScheduleGroupId
컨텍스트가 현재 작업 중인 일정 그룹의 식별자를 반환합니다.
virtual unsigned int GetScheduleGroupId() const = 0;
Return Value
컨텍스트가 현재 작업 중인 일정 그룹의 식별자입니다.
설명
이 메서드의 반환 값은 컨텍스트가 실행 중인 일정 그룹의 인스턴스 샘플링입니다. 이 메서드가 현재 컨텍스트가 아닌 다른 컨텍스트에서 호출될 경우 값은 반환되는 순간에 부실 값이 되어 사용할 수 없습니다. 일반적으로 이 메서드는 디버깅 또는 추적 용도로만 사용됩니다.
GetVirtualProcessorId
컨텍스트가 현재 실행 중인 가상 프로세서의 식별자를 반환합니다.
virtual unsigned int GetVirtualProcessorId() const = 0;
Return Value
컨텍스트가 현재 가상 프로세서에서 실행 중인 경우 컨텍스트가 현재 실행 중인 가상 프로세서의 식별자입니다. 그렇지 않으면 값 -1
입니다.
설명
이 메서드의 반환 값은 컨텍스트가 실행되는 가상 프로세서의 즉각적인 샘플링입니다. 이 값은 반환되는 순간 부실할 수 있으며, 이 값에 의존할 수 없습니다. 일반적으로 이 메서드는 디버깅 또는 추적 용도로만 사용됩니다.
ID
현재 컨텍스트가 속한 스케줄러 내에서 고유한 현재 컨텍스트에 대한 식별자를 반환합니다.
static unsigned int __cdecl Id();
Return Value
현재 컨텍스트가 스케줄러에 연결된 경우 현재 컨텍스트가 속한 스케줄러 내에서 고유한 현재 컨텍스트의 식별자입니다. 그렇지 않으면 값 -1
입니다.
IsCurrentTaskCollectionCanceling
현재 컨텍스트에서 인라인으로 실행 중인 작업 컬렉션이 활성 취소 중인지 곧 실행될 것인지 여부를 나타내는 표시를 반환합니다.
static bool __cdecl IsCurrentTaskCollectionCanceling();
Return Value
스케줄러가 호출 컨텍스트에 연결되어 있고 작업 그룹이 해당 컨텍스트에서 작업을 인라인으로 실행하는 경우 해당 작업 그룹이 활성 취소 중인지 또는 곧 취소될 것인지 여부를 나타냅니다. 그렇지 않으면 값 false
입니다.
IsSynchronouslyBlocked
컨텍스트가 동기적으로 차단되는지 여부를 확인합니다. 컨텍스트는 명시적으로 차단으로 이어지는 작업을 수행한 경우 동기적으로 차단된 것으로 간주됩니다.
virtual bool IsSynchronouslyBlocked() const = 0;
Return Value
컨텍스트가 동기적으로 차단되는지 여부입니다.
설명
컨텍스트는 명시적으로 차단으로 이어지는 작업을 수행한 경우 동기적으로 차단된 것으로 간주됩니다. 스레드 스케줄러에서 이는 Context::Block
메서드에 대한 직접 호출이나 Context::Block
메서드를 사용하여 작성된 동기화 개체를 나타냅니다.
이 메서드의 반환 값은 컨텍스트가 동기적으로 차단되는지 여부에 대한 즉각적인 샘플입니다. 이 값은 반환되는 순간 부실할 수 있으며 매우 구체적인 상황에서만 사용할 수 있습니다.
operator delete
Context
런타임에 의해 개체가 내부적으로 제거됩니다. 개체를 명시적으로 삭제할 수 없습니다.
void operator delete(void* _PObject);
매개 변수
_PObject
삭제할 개체에 대한 포인터입니다.
초과 구독
해당 스케줄러의 가상 프로세서 중 하나에서 실행되는 컨텍스트에서 호출될 때 코드 블록 기간 동안 스케줄러에 추가 가상 프로세서를 삽입합니다.
static void __cdecl Oversubscribe(bool _BeginOversubscription);
매개 변수
_BeginOversubscription
이 경우 true
초과 구독 기간 동안 추가 가상 프로세서를 추가해야 한다는 표시입니다. 이 경우 false
초과 구독이 종료되고 이전에 추가된 가상 프로세서를 제거해야 한다는 표시가 표시됩니다.
ScheduleGroupId
현재 컨텍스트가 작업 중인 일정 그룹의 식별자를 반환합니다.
static unsigned int __cdecl ScheduleGroupId();
Return Value
현재 컨텍스트가 스케줄러에 연결되고 일정 그룹에서 작업하는 경우 현재 컨텍스트가 작업 중인 스케줄러 그룹의 식별자입니다. 그렇지 않으면 값 -1
입니다.
차단 해제
컨텍스트의 차단을 해제하고 컨텍스트를 실행할 수 있게 합니다.
virtual void Unblock() = 0;
설명
Block 메서드에 대한 해당 호출 전에 메서드를 호출 Unblock
하는 것은 완벽하게 합법적입니다. 호출과 Unblock
메서드가 Block
제대로 쌍을 이루는 한 런타임은 두 순서의 자연스러운 경합을 적절하게 처리합니다. Unblock
호출 전에 오는 호출은 Block
단순히 호출의 Block
효과를 부정합니다.
이 메서드에서 throw할 수 있는 몇 가지 예외가 있습니다. 컨텍스트에서 메서드 자체를 호출 Unblock
하려고 하면 context_self_unblock 예외가 throw됩니다. 호출이 Block
Unblock
올바르게 쌍으로 연결되지 않은 경우(예: 현재 실행 중인 컨텍스트에 Unblock
대해 두 번의 호출이 이루어지는 경우) context_unblock_unbalanced 예외가 throw됩니다.
코드가 메서드를 호출 Unblock
할 수 있는 다른 스레드의 컨텍스트를 게시하는 지점과 실제 메서드 호출 Block
이 이루어지는 지점 사이에는 중요한 기간이 있습니다. 이 기간 동안에는 잠금 가져오기 등과 같은 개별적인 이유로 차단하거나 차단 해제할 수 있는 메서드를 호출해서는 안 됩니다. 및 Unblock
메서드에 대한 호출은 Block
차단 및 차단 해제 이유를 추적하지 않습니다. 하나의 개체만 한 Unblock
쌍의 소유권을 Block
가져야 합니다.
VirtualProcessorId
현재 컨텍스트가 실행 중인 가상 프로세서의 식별자를 반환합니다.
static unsigned int __cdecl VirtualProcessorId();
Return Value
현재 컨텍스트가 스케줄러에 연결된 경우 현재 컨텍스트가 실행 중인 가상 프로세서의 식별자입니다. 그렇지 않으면 값 -1
입니다.
설명
이 메서드의 반환 값은 현재 컨텍스트가 실행 중인 가상 프로세서의 즉각적인 샘플링입니다. 이 값은 반환되는 순간 부실할 수 있으며, 이 값에 의존할 수 없습니다. 일반적으로 이 메서드는 디버깅 또는 추적 용도로만 사용됩니다.
Yield
다른 컨텍스트에서 실행할 수 있도록 실행을 양도합니다. 양도할 수 있는 다른 컨텍스트가 없는 경우 스케줄러에서 다른 운영 체제 스레드에 양도할 수 있습니다.
static void __cdecl Yield();
설명
이 메서드를 사용하면 현재 호출 컨텍스트와 연결된 스케줄러가 없는 경우 프로세스의 기본 스케줄러가 생성되고 호출 컨텍스트에 연결됩니다.
YieldExecution
다른 컨텍스트에서 실행할 수 있도록 실행을 양도합니다. 양도할 수 있는 다른 컨텍스트가 없는 경우 스케줄러에서 다른 운영 체제 스레드에 양도할 수 있습니다.
static void __cdecl YieldExecution();
설명
이 메서드를 사용하면 현재 호출 컨텍스트와 연결된 스케줄러가 없는 경우 프로세스의 기본 스케줄러가 생성되고 호출 컨텍스트에 연결됩니다.
이 함수는 Visual Studio 2015에서 새로 추가되었으며 Yield 함수와 동일하지만 Windows.h의 Yield 매크로와 충돌하지는 않습니다.