다음을 통해 공유


컨텍스트

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

동시성 런타임은 기본 스케줄러를 제공하므로 애플리케이션에서 스케줄러를 만들 필요가 없습니다. 작업 스케줄러는 애플리케이션의 성능을 미세 조정하는 데 도움이 되므로 동시성 런타임을 접하는 경우 PPL(병렬 패턴 라이브러리) 또는 비동기 에이전트 라이브러리로 시작하는 것이 좋습니다.

wait 함수

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

매개 변수에 대해 milliseconds 0을 전달하면 다른 모든 활성 컨텍스트에 작업을 수행할 수 있는 기회가 주어질 때까지 런타임이 현재 컨텍스트를 일시 중단합니다. 이렇게 하면 다른 모든 활성 작업에 작업을 생성할 수 있습니다.

예시

함수를 wait 사용하여 현재 컨텍스트를 생성하여 다른 컨텍스트를 실행할 수 있도록 하는 예제는 방법: 일정 그룹을 사용하여 실행 순서에 영향을 줍니다.

컨텍스트 클래스

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

협조적 차단

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

동시성::Context::Block 메서드는 현재 컨텍스트를 차단합니다. 차단된 컨텍스트는 런타임이 다른 작업을 수행할 수 있도록 처리 리소스를 생성합니다. 동시성::Context::Unblock 메서드는 차단된 컨텍스트의 차단을 해제합니다. 메서드는 Context::Unblock 호출된 컨텍스트와 다른 컨텍스트에서 호출 Context::Block해야 합니다. 컨텍스트에서 자체 차단을 해제하려고 하면 런타임에서 동시성::context_self_unblock throw됩니다.

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

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

동시성::Context::Yield 메서드는 런타임이 다른 작업을 수행한 다음 실행 컨텍스트를 다시 예약할 수 있도록 실행을 생성합니다. 메서드를 Context::Block 호출할 때 런타임은 컨텍스트를 다시 예약하지 않습니다.

예시

및 메서드를 Context::BlockContext::UnblockContext::Yield 사용하여 협조 세마포 클래스를 구현하는 예제는 방법: 컨텍스트 클래스를 사용하여 협동 세마포 구현을 참조하세요.

초과 구독

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

계산 집약적인 작업의 경우 일반적으로 초과 구독은 추가 오버헤드를 발생하므로 크기가 조정되지 않습니다. 그러나 대기 시간이 많은 작업의 경우(예: 디스크 또는 네트워크 연결에서 데이터를 읽는 경우) 초과 구독은 일부 애플리케이션의 전반적인 효율성을 향상시킬 수 있습니다.

참고 항목

동시성 런타임을 통해 생성된 스레드에서만 초과 구독을 사용하도록 설정하십시오. 초과 구독은 런타임(주 스레드 포함)에 의해 생성되지 않은 스레드에서 호출되는 경우 효과가 없습니다.

현재 컨텍스트에서 초과 구독을 사용하도록 설정하려면 매개 변수가 설정된 동시성::Context::Oversubscribe 메서드 _BeginOversubscription 를 호출합니다true. 동시성 런타임에서 만든 스레드에서 초과 구독을 사용하도록 설정하면 런타임에서 스레드를 하나 더 만듭니다. 초과 구독이 필요한 모든 작업이 완료되면 매개 변수를 _BeginOversubscription 다음으로 설정하여 호출 Context::Oversubscribe 합니다false.

현재 컨텍스트에서 초과 구독을 여러 번 사용하도록 설정할 수 있지만 사용하도록 설정한 횟수와 동일한 횟수만큼 사용하지 않도록 설정해야 합니다. 초과 구독은 중첩될 수도 있습니다. 즉, 초과 구독을 사용하는 다른 태스크에서 만든 작업은 컨텍스트를 초과 구독할 수도 있습니다. 그러나 중첩된 작업과 해당 부모가 모두 동일한 컨텍스트에 속하는 경우 가장 바깥쪽 호출 Context::Oversubscribe 만 추가 스레드를 만듭니다.

참고 항목

런타임은 동시성::invalid_oversubscribe_operation 초과 구독을 사용하도록 설정하기 전에 사용하지 않도록 설정하면 throw됩니다.

예시

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

참고 항목

작업 Scheduler
방법: 실행 순서에 영향을 주는 일정 그룹 사용
방법: 컨텍스트 클래스를 사용하여 공동 작업 세마포 구현
방법: 초과 구독을 사용하여 대기 오프셋