다음을 통해 공유


컨텍스트

업데이트: 2010년 7월

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

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

wait 함수

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

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

예제

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

Context 클래스

Concurrency::Context 클래스에서는 실행 컨텍스트에 대한 프로그래밍 추상화를 제공하고, 두 가지 중요한 기능을 제공합니다. 이 중 하나는 현재 컨텍스트를 협조적으로 차단, 차단 해제 및 양보하는 기능이고 다른 하나는 현재 컨텍스트를 초과 구독하는 기능입니다.

협조적 차단

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

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

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

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

Concurrency::Context::Yield 메서드는 런타임에서 다른 작업을 수행한 다음 실행할 컨텍스트를 다시 예약 할 수 있도록 실행을 양보합니다. Context::Block 메서드를 호출하면 런타임에서 컨텍스트를 다시 예약하지 않습니다.

예제

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

초과 구독

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

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

참고

동시성 런타임에 의해 만들어진 비UMS 스레드에서만 초과 구독을 사용하도록 설정하십시오. 런타임에 의해 만들어지지 않은 스레드(주 스레드 포함)로부터 초과 구독이 호출되면 초과 구독이 아무런 영향도 미치지 않습니다. UMS 스레드를 사용하여 작업을 예약하는 컨텍스트에서 초과 구독이 호출되는 경우에도 초과 구독은 아무런 영향을 미치지 않습니다. UMS 스레드에서는 차단 작업이 있을 때 스케줄러가 리소스를 완전히 사용하도록 하기 때문입니다.

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

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

참고

초과 구독을 사용하도록 설정하기 전에 사용하지 않도록 설정되어 있으면 런타임에서 Concurrency::invalid_oversubscribe_operation을 throw합니다.

예제

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

참고 항목

작업

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

개념

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

기타 리소스

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

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

변경 기록

날짜

변경 내용

이유

2010년 7월

내용을 다시 구성했습니다.

향상된 기능 관련 정보