2012-10-18 2 views
5

우리는 PPL Concurrency :: TaskScheduler을 사용하여 미디어 파이프 라인의 이벤트를 구독 클라이언트 (일반적으로 GUI 응용 프로그램)로 발송합니다.Microsoft PPL 경량 작업 스케줄러로 백 오프를 구현하는 방법은 무엇입니까?

이 이벤트는 Concurrency :: TaskScheduler :: ScheduleTask()에 전달 된 C++ 람다입니다.

그러나 부하가있는 상태에서 파이프 라인은 클라이언트가 소비 할 수있는 것보다 더 빠른 속도로 이벤트를 생성 할 수 있습니다.

내가 (실제로 예약 된 작업) 예약 된 작업의 '큐'N보다 큰 경우를 이벤트를 대기 하지에 이벤트 디스패처를 야기하는 데 사용할 수있는 PPL 전략이 있습니까? 그리고 그렇지 않다면 어떻게 내 자신을 굴릴 수 있습니까?

답변

1

API를 살펴보면 스케줄러가 과부하 상태인지 여부를 알 수 없으며 이러한 상황에서 어떻게 행동해야하는지 알려주지 않습니다. 필자는 정책을 사용하여 스케줄러 내에서 실행될 수있는 동시 스레드 수에 대한 제한을 설정할 수는 있지만 스케줄러가 새 작업을 수락하거나 거부 할 수있는 프로토콜은 분명하지 않습니다.

내 생각에 그 메커니즘을 직접 구현하고, 얼마나 많은 태스크가 이미 스케줄러에 있는지 계산하고, 스케줄러보다 크기가 제한된 큐를 가져서 들어오는 태스크의 흐름을 완화하는 데 도움이됩니다.

람다에 간단한 std :: queue를 사용할 수 있고 새 이벤트가있을 때마다 실행중인 작업 수를 확인하고 최대한 많은 큐를 추가하여 최대 값에 도달 할 수 있다고 가정합니다 실행중인 작업 수. 그 이후에 큐가 여전히 가득 차 있으면 새 태스크를 거부합니다.

실행중인 작업 계산을 처리하려면 완료 시간에 카운터를 감소시키는 함수 (레이스를 피하기 위해 뮤텍스 사용)로 작업을 래핑하고 새 작업을 예약 할 때 카운터를 증가시킬 수 있습니다.

관련 문제