2016-11-22 12 views
1

나는 그것의 Scheduler 클래스를 사용하여 PPL의 원시 스레드의 수를 관리하기 위해 노력하고, 여기에 내 코드입니다 :PPL - 원시 스레드의 수를 구성하는 방법은 무엇입니까?

for (int i = 0; i < 2000; i ++) 
{ 
    // configure concurrency count 16 to 32. 
    concurrency::SchedulerPolicy policy = concurrency::SchedulerPolicy(2, concurrency::MinConcurrency, 16, 
      concurrency::MaxConcurrency, 32); 
    concurrency::Scheduler *pScheduler = concurrency::Scheduler::Create(policy); 
    HANDLE hShutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 
    pScheduler->RegisterShutdownEvent(hShutdownEvent); 
    pScheduler->Attach(); 

    ////////////////////////////////////////////////////////////////////////// 

    //for (int i = 0; i < 2000; i ++) 
    { 
     concurrency::create_task([]{ 
      concurrency::wait(1000); 
      OutputDebugString(L"Task Completed\n"); 
     }); 
    } 

    ////////////////////////////////////////////////////////////////////////// 

    concurrency::CurrentScheduler::Detach(); 
    pScheduler->Release(); 
    WaitForSingleObject(hShutdownEvent, INFINITE); 
    CloseHandle(hShutdownEvent); 
} 

SchedulerPolicy의 사용은 MSDN에서이지만, 그것은 전혀 작동하지 않았다. 위의 코드에서 예상 한 결과는 PPL이 2000 개의 작업을 실행하기 위해 16에서 32 개의 스레드를 실행하지만 사실은 다음과 같습니다.

콘솔 출력 속도를 관찰하면 1 초 이내에 하나의 작업 만 처리됩니다. for 루프를 주석 처리하고 내부 루프 for의 주석 처리를 제거하려고 시도했지만, 이로 인해 300 개의 스레드가 생성되지만 여전히 올바르지 않습니다. 내가 wait 시간이 길어지면 생성되는 스레드가 훨씬 더 많아집니다.

PPL에서 동시성을 구성하는 올바른 방법은 무엇입니까?

+0

가능한 이유 중 하나는 'WaitForSingleObject' 호출이 완료 될 때까지 각 루프를 차단하여 매번 1 초 동안 루프가 실행되는 것입니다. 그러나 올바른 방법은 무엇입니까? –

답변

1

내가 작업 본체 내에서 concurrency::wait을하지 말아야 입증 된 현재 작업이 wait에 의해 중단되었을 때, 그것은 사용을 최대화하기 위해 대기열에 작업의 나머지 일정을 시작합니다 PPL 모드를 훔치는 일에 작동 컴퓨팅 자원의

실제 프로젝트에서 concurrency::create_task을 사용할 때 작업 본문 내에 몇 가지 실제 계산이 있으므로 PPL은 더 이상 수백 개의 스레드를 생성하지 않습니다.

또한 SchedulePolicy은 PPL이 작업을 처리하는 데 사용할 수있는 가상 프로세서 수를 구성하는 데 사용할 수 있습니다. 이는 PPL에서 생성하는 원시 스레드 수와 항상 같지 않습니다.

PPL 그냥 수영장에서 8 개 스레드를 만들 것 기본적으로 내 CPU는 8 개의 가상 프로세서를 가지고 말하고, 그러나 그 스레드 중 일부는 wait 또는 lock에 의해 중단되었을 때, 또한 큐에 대기중인 많은 작업이 있습니다, PPL은 즉시 것 (가상 프로세서가 완전히로드되지 않은 경우) 더 많은 스레드를 만들어 실행하십시오.