컨텍스트Contexts

이 문서에서는 동시성 런타임 컨텍스트의 역할에 대해 설명 합니다.This document describes the role of contexts in the Concurrency Runtime. 스케줄러에 연결 된 스레드를 실행 컨텍스트나 컨텍스트라고 합니다.A thread that is attached to a scheduler is known as an execution context, or just context. Concurrency:: wait 함수와 concurrency::Context 클래스 를 사용 하면 컨텍스트의 동작을 제어할 수 있습니다.The concurrency::wait function and the concurrency::Context class enable you to control the behavior of contexts. 함수를 사용 wait 하 여 지정 된 시간 동안 현재 컨텍스트를 일시 중단 합니다.Use the wait function to suspend the current context for a specified time. Context컨텍스트가 차단, 차단 해제 및 양보 될 때 또는 현재 컨텍스트를 oversubscribe 할 때 더 많은 제어가 필요한 경우 클래스를 사용 합니다.Use the Context class when you need more control over when contexts block, unblock, and yield, or when you want to oversubscribe the current context.

동시성 런타임은 기본 스케줄러를 제공하므로 애플리케이션에서 스케줄러를 만들 필요가 없습니다.The Concurrency Runtime provides a default scheduler, and therefore you are not required to create one in your application. 작업 스케줄러는 응용 프로그램의 성능을 미세 조정 하는 데 도움이 되므로 동시성 런타임를 처음 접하는 경우 PPL (병렬 패턴 라이브러리) 또는 비동기 에이전트 라이브러리 를 사용 하는 것이 좋습니다.Because the Task Scheduler helps you fine-tune the performance of your applications, we recommend that you start with the Parallel Patterns Library (PPL) or the Asynchronous Agents Library if you are new to the Concurrency Runtime.

Wait 함수The wait Function

Concurrency:: wait 함수는 지정 된 시간 (밀리초) 동안 현재 컨텍스트의 실행을 협조적으로 생성 합니다.The concurrency::wait function cooperatively yields the execution of the current context for a specified number of milliseconds. 런타임에서는 양보 시간을 사용 하 여 다른 작업을 수행 합니다.The runtime uses the yield time to perform other tasks. 지정 된 시간이 경과 된 후 런타임은 실행을 위해 컨텍스트를 다시 예약 합니다.After the specified time has elapsed, the runtime reschedules the context for execution. 따라서 함수는 wait 매개 변수에 제공 된 값 보다 오래 된 현재 컨텍스트를 일시 중단할 수 있습니다 milliseconds .Therefore, the wait function might suspend the current context longer than the value provided for the milliseconds parameter.

매개 변수에 0을 전달 milliseconds 하면 다른 모든 활성 컨텍스트를 사용 하 여 작업을 수행할 수 있을 때까지 런타임이 현재 컨텍스트를 일시 중단 합니다.Passing 0 (zero) for the milliseconds parameter causes the runtime to suspend the current context until all other active contexts are given the opportunity to perform work. 이렇게 하면 다른 모든 활성 태스크에 대 한 작업을 생성할 수 있습니다.This lets you yield a task to all other active tasks.

예제Example

함수를 사용 하 여 wait 현재 컨텍스트를 생성 하 고 다른 컨텍스트를 실행할 수 있도록 하는 예제는 방법: 일정 그룹을 사용 하 여 실행 순서에 영향을 참조 하세요.For an example that uses the wait function to yield the current context, and thus allow for other contexts to run, see How to: Use Schedule Groups to Influence Order of Execution.

컨텍스트 클래스The Context Class

Concurrency::context 클래스 는 실행 컨텍스트에 대 한 프로그래밍 추상화를 제공 하 고, 현재 컨텍스트를 협조적으로 차단, 차단 해제 및 양보 하는 기능 및 현재 컨텍스트를 oversubscribe 하는 기능을 제공 하는 두 가지 중요 한 기능을 제공 합니다.The concurrency::Context class provides a programming abstraction for an execution context and offers two important features: the ability to cooperatively block, unblock, and yield the current context, and the ability to oversubscribe the current context.

협조적 차단Cooperative Blocking

Context클래스를 사용 하 여 현재 실행 컨텍스트를 차단 하거나 생성할 수 있습니다.The Context class lets you block or yield the current execution context. 차단 또는 생성은 리소스를 사용할 수 없기 때문에 현재 컨텍스트를 계속할 수 없는 경우에 유용 합니다.Blocking or yielding is useful when the current context cannot continue because a resource is not available.

Concurrency:: context:: Block 메서드는 현재 컨텍스트를 차단 합니다.The concurrency::Context::Block method blocks the current context. 차단 된 컨텍스트는 런타임에서 다른 작업을 수행할 수 있도록 처리 리소스를 생성 합니다.A context that is blocked yields its processing resources so that the runtime can perform other tasks. Concurrency:: context:: 차단 해제 메서드는 차단 된 컨텍스트를 차단 해제 합니다.The concurrency::Context::Unblock method unblocks a blocked context. 메서드는를 호출 하는 것과 Context::Unblock 다른 컨텍스트에서 호출 되어야 합니다 Context::Block .The Context::Unblock method must be called from a different context than the one that called Context::Block. 런타임에서는 컨텍스트를 차단 해제 하려는 경우 concurrency:: context_self_unblock 을 throw 합니다.The runtime throws concurrency::context_self_unblock if a context attempts to unblock itself.

컨텍스트를 협조적으로 차단 및 차단 해제 하기 위해 일반적으로 concurrency:: context:: CurrentContext 를 호출 하 여 현재 스레드와 연결 된 개체에 대 한 포인터를 검색 하 Context 고 그 결과를 저장 합니다.To cooperatively block and unblock a context, you typically call concurrency::Context::CurrentContext to retrieve a pointer to the Context object that is associated with the current thread and save the result. 그런 다음 메서드를 호출 Context::Block 하 여 현재 컨텍스트를 차단 합니다.You then call the Context::Block method to block the current context. 나중에 Context::Unblock 개별 컨텍스트에서를 호출 하 여 차단 된 컨텍스트의 차단을 해제 합니다.Later, call Context::Unblock from a separate context to unblock the blocked context.

및에 대 한 각 호출 쌍을 일치 시켜야 합니다 Context::Block Context::Unblock .You must match each pair of calls to Context::Block and Context::Unblock. 런타임에서는 concurrency::context_unblock_unbalanced Context::Block Context::Unblock 다른 메서드에 대 한 일치 하는 호출 없이 또는 메서드가 연속적으로 호출 될 때 concurrency:: context_unblock_unbalanced을 throw 합니다.The runtime throws concurrency::context_unblock_unbalanced when the Context::Block or Context::Unblock method is called consecutively without a matching call to the other method. 그러나를 호출 하기 전에를 호출할 필요가 없습니다 Context::Block Context::Unblock .However, you do not have to call Context::Block before you call Context::Unblock. 예를 들어 한 컨텍스트가 Context::Unblock 동일한 컨텍스트에 대해 다른 컨텍스트를 호출 하기 전에를 호출 하 Context::Block 는 경우 해당 컨텍스트는 차단 해제 된 상태로 유지 됩니다.For example, if one context calls Context::Unblock before another context calls Context::Block for the same context, that context remains unblocked.

Concurrency:: Context:: Yield 메서드는 런타임이 다른 작업을 수행한 다음 실행을 위해 컨텍스트를 다시 예약할 수 있도록 실행을 생성 합니다.The concurrency::Context::Yield method yields execution so that the runtime can perform other tasks and then reschedule the context for execution. 메서드를 호출 하면 Context::Block 런타임에서 컨텍스트를 다시 예약 하지 않습니다.When you call the Context::Block method, the runtime does not reschedule the context.

예제Example

, 및 메서드를 사용 하 여 협조적 세마포 클래스를 구현 하는 예제는 Context::Block Context::Unblock Context::Yield 방법: 컨텍스트 클래스를 사용 하 여 협조적 세마포 구현을 참조 하세요.For an example that uses the Context::Block, Context::Unblock, and Context::Yield methods to implement a cooperative semaphore class, see How to: Use the Context Class to Implement a Cooperative Semaphore.

초과 구독Oversubscription

기본 스케줄러는 사용 가능한 하드웨어 스레드와 동일한 수의 스레드를 만듭니다.The default scheduler creates the same number of threads as there are available hardware threads. 초과 구독 을 사용 하 여 지정 된 하드웨어 스레드에 대 한 추가 스레드를 만들 수 있습니다.You can use oversubscription to create additional threads for a given hardware thread.

계산을 많이 수행 하는 작업의 경우에는 일반적으로 추가 오버 헤드가 발생 하므로 초과 구독이 확장 되지 않습니다.For computationally intensive operations, oversubscription typically does not scale because it introduces additional overhead. 그러나 디스크에서 데이터를 읽거나 네트워크를 연결 하는 등의 대기 시간이 많은 작업의 경우에는 초과 구독이 일부 응용 프로그램의 전반적인 효율성을 향상 시킬 수 있습니다.However, for tasks that have a high amount of latency, for example, reading data from disk or from a network connection, oversubscription can improve the overall efficiency of some applications.

참고

동시성 런타임을 통해 생성된 스레드에서만 초과 구독을 사용하도록 설정하십시오.Enable oversubscription only from a thread that was created by the Concurrency Runtime. 시간 초과는 런타임에 의해 생성 되지 않은 스레드에서 호출 된 경우 (주 스레드 포함)에는 영향을 주지 않습니다.Oversubscription has no effect when it is called from a thread that was not created by the runtime (including the main thread).

현재 컨텍스트에서 초과 구독을 사용 하도록 설정 하려면 매개 변수를로 설정 하 여 concurrency:: context:: Oversubscribe 메서드를 호출 합니다 _BeginOversubscription true .To enable oversubscription in the current context, call the concurrency::Context::Oversubscribe method with the _BeginOversubscription parameter set to true. 동시성 런타임에서 만든 스레드에서 초과 구독을 사용 하도록 설정 하면 런타임에서 추가 스레드 하나를 만듭니다.When you enable oversubscription on a thread that was created by the Concurrency Runtime, it causes the runtime to create one additional thread. 초과 구독을 필요로 하는 모든 작업이 완료 되 면 Context::Oversubscribe _BeginOversubscription 매개 변수를로 설정 하 여를 호출 false 합니다.After all tasks that require oversubscription finish, call Context::Oversubscribe with the _BeginOversubscription parameter set to false.

현재 컨텍스트에서 초과 구독을 여러 번 사용 하도록 설정할 수 있지만 사용 하도록 설정 하는 것과 동일한 횟수를 사용 하지 않도록 설정 해야 합니다.You can enable oversubscription multiple times from the current context, but you must disable it the same number of times that you enable it. 초과 구독을 중첩할 수도 있습니다. 즉, 구독을 사용 하는 다른 작업에서 만든 작업은 해당 컨텍스트를 oversubscribe 수도 있습니다.Oversubscription can also be nested; that is, a task that is created by another task that uses oversubscription can also oversubscribe its context. 그러나 중첩 된 작업과 부모를 모두 동일한 컨텍스트에 속하면의 가장 바깥쪽 호출만 Context::Oversubscribe 추가 스레드를 생성 합니다.However, if both a nested task and its parent belong to the same context, only the outermost call to Context::Oversubscribe causes the creation of an additional thread.

참고

사용 하도록 설정 하기 전에 시간 초과를 사용 하지 않도록 설정 하면 런타임에서 concurrency:: invalid_oversubscribe_operation 을 throw 합니다.The runtime throws concurrency::invalid_oversubscribe_operation if oversubscription is disabled before it is enabled.

예제Example

초과 구독을 사용 하 여 네트워크 연결에서 데이터를 읽는 경우 발생 하는 대기 시간을 오프셋 하는 예제는 방법: 초과 구독을 사용 하 여 대기 시간 오프셋을 참조 하세요.For an example that uses oversubscription to offset the latency that is caused by reading data from a network connection, see How to: Use Oversubscription to Offset Latency.

참고 항목See also

작업 스케줄러Task Scheduler
방법: 일정 그룹을 사용 하 여 실행 순서에 영향을 줍니다.How to: Use Schedule Groups to Influence Order of Execution
방법: 컨텍스트 클래스를 사용 하 여 협조적 세마포 구현How to: Use the Context Class to Implement a Cooperative Semaphore
방법: 초과 구독을 사용 하 여 대기 시간 오프셋How to: Use Oversubscription to Offset Latency