다음을 통해 공유


컨텍스트

이 문서에서는 동시성 런타임에서 컨텍스트의 역할에 대해 설명합니다.스케줄러에 연결된 스레드를 실행 컨텍스트 또는 컨텍스트라고 합니다.Concurrency::wait 함수 및 concurrency::Context 클래스를 사용 하 여 컨텍스트의 동작을 제어 합니다.wait 함수를 사용하여 지정된 시간 동안 현재 컨텍스트를 일시 중단할 수 있습니다.컨텍스트를 차단, 차단 해제 및 양보할 때 더 세부적으로 제어해야 할 경우 또는 현재 컨텍스트를 초과 구독하려는 경우 Context 클래스를 사용합니다.

팁

동시성 런타임에서 기본 스케줄러를 제공하므로 응용 프로그램에서 스케줄러를 만들 필요가 없습니다.작업 스케줄러를 사용하면 응용 프로그램의 성능을 세부적으로 조정할 수 있으므로 동시성 런타임을 처음 사용하는 경우 PPL(병렬 패턴 라이브러리) 또는 비동기 에이전트 라이브러리에서 시작하는 것이 좋습니다.

wait 함수

Concurrency::wait 함수 인스턴스들이 협력 하 여 현재 컨텍스트에 대해 지정 된 시간 (밀리초)의 실행을 얻을 수 있습니다.런타임에서는 이러한 양보 시간을 사용하여 다른 작업을 수행합니다.지정된 시간이 경과한 후에는 런타임에서 컨텍스트의 실행 일정을 조정합니다.따라서 wait 함수는 milliseconds 매개 변수에 제공된 값보다 오래 현재 컨텍스트를 일시 중단할 수도 있습니다.

milliseconds 매개 변수에 0을 전달하면 다른 모든 활성 컨텍스트가 작업을 수행할 수 있을 때까지 런타임에서 현재 컨텍스트를 일시 중단하게 됩니다.즉, 다른 모든 활성 작업에 현재 작업을 양보하게 됩니다.

Ff829266.collapse_all(ko-kr,VS.110).gif예제

wait 함수를 사용하여 현재 컨텍스트를 양보함으로써 다른 컨텍스트를 실행할 수 있게 하는 예제는 방법: 실행 순서에 영향을 주는 일정 그룹 사용를 참조하십시오.

Context 클래스

Concurrency::Context 클래스는 실행 컨텍스트를 위해 프로그래밍 추상화를 제공 하 고 두 가지 중요 한 기능을 제공: 방식의 차단 차단 해제를, 현재 컨텍스트를 얻을 수 있으며 현재 컨텍스트를 oversubscribe 수 있습니다.

Ff829266.collapse_all(ko-kr,VS.110).gif협조적 차단

Context 클래스를 사용하면 현재 실행 컨텍스트를 차단하거나 양보할 수 있습니다.차단 또는 양보 기능은 리소스를 사용할 수 없어 현재 컨텍스트를 계속할 수 없는 경우 유용합니다.

Concurrency::Context::Block 메서드는 현재 컨텍스트를 차단 합니다.차단된 컨텍스트는 런타임에서 다른 작업을 수행할 수 있도록 처리 리소스를 양보합니다.Concurrency::Context::Unblock 메서드가 차단 된 컨텍스트를 차단 합니다.Context::Unblock 메서드는 Context::Block을 호출한 컨텍스트가 아닌 다른 컨텍스트에서 호출해야 합니다.런타임에서 throw concurrency::context_self_unblock 컨텍스트 자체를 차단 하려고 하는 경우.

인스턴스들이 협력 하 여 차단 하 고 컨텍스트를 차단을 해제 하려면 일반적으로 호출 concurrency::Context::CurrentContext 에 대 한 포인터를 검색 하는 Context 결과 저장 하 고 현재 스레드와 연결 된 개체입니다.그런 다음 Context::Block 메서드를 호출하여 현재 컨텍스트를 차단합니다.나중에 별도의 컨텍스트에서 Context::Unblock을 호출하면 차단된 컨텍스트를 차단 해제할 수 있습니다.

Context::BlockContext::Unblock 호출의 각 쌍을 일치시켜야 합니다.런타임에서 throw concurrency::context_unblock_unbalanced 때의 Context::Block 또는 Context::Unblock 메서드가 호출 연속적으로 일치 하는 다른 메서드를 호출 하지 않고.그러나 Context::Unblock을 호출하기 전에 Context::Block을 호출할 필요가 없습니다.예를 들어 한 컨텍스트에서 Context::Unblock을 호출한 후 이 컨텍스트에 대해 다른 컨텍스트에서 Context::Block을 호출하면 해당 컨텍스트가 차단되지 않은 상태로 유지됩니다.

Concurrency::Context::Yield 메서드가 생성 실행 런타임에 다른 작업을 수행 하 고 다음 컨텍스트 실행을 위한 일정을 재조정할 수 있도록 합니다.Context::Block 메서드를 호출하면 런타임에서 컨텍스트를 다시 예약하지 않습니다.

Ff829266.collapse_all(ko-kr,VS.110).gif예제

Context::Block, Context::UnblockContext::Yield 메서드를 사용하여 협조적 세마포 클래스를 구현하는 예제를 보려면 방법: 컨텍스트 클래스를 사용하여 공동 작업 세마포 구현을 참조하십시오.

Ff829266.collapse_all(ko-kr,VS.110).gif초과 구독

기본 스케줄러는 사용 가능한 하드웨어 스레드와 같은 수의 스레드를 만듭니다.초과 구독을 사용하면 지정된 하드웨어 스레드에 대한 추가 스레드를 만들 수 있습니다.

초과 구독은 추가 오버헤드를 생성하므로 계산이 복잡한 작업의 경우에는 일반적으로 초과 구독이 적합하지 않습니다.그러나 디스크 또는 네트워크 연결에서 데이터를 읽는 것처럼 대기 시간이 많은 작업의 경우 초과 구독을 사용하면 일부 응용 프로그램의 전반적인 효율성을 향상시킬 수 있습니다.

[!참고]

하기에서 동시성 런타임에서 만들어진 스레드에서만 사용 합니다.런타임에 의해 만들어지지 않은 스레드(주 스레드 포함)로부터 초과 구독이 호출되면 초과 구독이 아무런 영향도 미치지 않습니다.

호출 하기에는 현재 컨텍스트를 사용 하는 concurrency::Context::Oversubscribe 메서드를 사용의 _BeginOversubscription 매개 변수를 설정 true.동시성 런타임에서 만든 스레드에서 초과 구독을 사용하도록 설정하면 런타임에서 추가 스레드 하나가 만들어집니다.초과 구독이 필요한 모든 작업이 끝난 후에는 _BeginOversubscription 매개 변수를 false로 설정하고 Context::Oversubscribe를 호출합니다.

현재 컨텍스트에서 초과 구독을 여러 번 설정할 수는 있지만 설정한 수만큼 다시 설정 해제해야 합니다.또한 초과 구독을 중첩할 수도 있습니다. 즉, 초과 구독을 사용하는 다른 작업에서 만든 작업에서 자신의 컨텍스트를 초과 구독할 수도 있습니다.그러나 중첩 작업과 부모 작업이 둘 다 같은 컨텍스트에 속한 경우에는 가장 바깥쪽의 Context::Oversubscribe 호출만 추가 스레드를 만듭니다.

[!참고]

런타임에서 throw concurrency::invalid_oversubscribe_operation 사용 하기 전에 하기를 사용할 수 없는 경우.

Ff829266.collapse_all(ko-kr,VS.110).gif예제

초과 구독을 사용하여 네트워크 연결에서 데이터 읽기를 통해 발생한 대기 시간을 오프셋하는 방법에 대한 예제를 보려면 방법: 초과 구독을 사용하여 대기 오프셋을 참조하십시오.

참고 항목

작업

방법: 실행 순서에 영향을 주는 일정 그룹 사용

방법: 컨텍스트 클래스를 사용하여 공동 작업 세마포 구현

방법: 초과 구독을 사용하여 대기 오프셋

개념

작업 스케줄러(동시성 런타임)