parallel_invoke는 일련의 태스크를 병렬로 실행할 때 사용합니다. 그리고 모든 태스크가 끝날 때까지 대기합니다. 이 알고리즘은 복수의 독립된 태스크를 실행할 때 유용합니다.
‘일련의 태스크를 병렬로 실행할 때 사용’이라는 것을 들었을 때 생각나는 것이 없는가요? 지금까지 제가 올렸던 글을 보셨던 분이라면 parallel task라는
말이 나와야 합니다. ^^
네
parallel_invoke는 parallel task와 비슷합니다.
parallel_invoke와 parallel task의 다른 점
복수 개의 태스크를 병렬로 실행한다는 것은 둘 다 같지만 아래와 같은 차이점이 있습니다.
|
parallel_invoke |
parallel task |
편이성 |
작업 함수만 정의하면 된다. |
작업 함수를 만든 후 task handle로 관리해야 한다. |
태스크 개수 |
10개 이하만 가능 |
제한 없음 |
모든 태스크의 종료 시 대기 |
무조건 모든 태스크가 끝날 때까지 대기 |
Wait를 사용하지 않으면 대기 하지 않는다. |
parallel_invoke를 사용할 때
병렬로 실행할 태스크의 개수가 10개 이하이고, 모든 태스크가 종료 할 때까지 대기해도 상관 없는
경우에는 간단하게 사용할 수 있는 parallel_invoke를 사용하는 것이 좋습니다. 하지만 반대로 병렬로 실행할 태스크가 10개를 넘고 모든 태스크의
종료를 대기하지 않아야 할 때는 parallel task를 사용해야 합니다.
parallel_invoke 사용 방법
parallel_invoke는 병렬로 태스크를 두 개만 실행하는 것에서 10개까지 실행하는 9개의 버전이 있으며 파라미터를 두 개만 사용하는 것에서 10개의 파라미터를
사용하는 것으로 오버로드 되어 있습니다.
각 오버로드된 버전의 파라미터에는 태스크를
정의한 작업 함수를 넘겨야 합니다.
parallel_invoke 사용 예
아래 예제는 아주 간단한 것으로 게임 프로그램이
처음 실행할 때 각종 파일을 로딩하는 것을 아주 간략화 하여 parallel_invoke를 사용한 예입니다.
#include <iostream>
#include <ctime>
#include <windows.h>
#include <concrt.h>
#include <concrtrm.h>
using namespace std;
#include <ppl.h>
using namespace Concurrency;
// UI 이미지 로딩
void LoadUIImage()
{
Sleep(1000);
cout
<< "Load Complete UI Image" << endl;
}
// 텍스쳐 로딩
void LoadTexture()
{
Sleep(1000);
cout
<< "Load Complete Texture" << endl;
}
// 폰트 파일 로딩
void LoadFont()
{
Sleep(1000);
cout
<< "Load Complete Font" << endl;
}
int main()
{
parallel_invoke(
[] { LoadUIImage(); },
[] { LoadTexture(); },
[] { LoadFont(); }
);
getchar();
return
0;
}
< 실행 결과 >
위 예제를 parallel_invoke를 사용하지 않고 전통적인 방법으로 순서대로 실행했다면 각 작업 함수에서 1초씩 소비하므로 3초가 걸리지만
parallel_invoke를 사용하여 1초만에 끝납니다.
그리고 이전에 parallel_for에서도 이야기 했듯이 병렬로 실행할 때는
순서가 지켜지지 않는다는 것을 꼭 유의하시기 바랍니다. 위의 예의 경우도 LoadUIImage()을 첫 번째 파라미터로 넘겼지만 실행 결과를 보면 LoadFont()가
먼저 완료 되었습니다.
마지막으로 위의 예제코드에서 parallel_invoke와 관계 있는 부분만 추려볼 테니 확실하게 사용 방법을 외우시기를 바랍니다.^^
#include <ppl.h>
using namespace Concurrency;
// 태스크 정의
void LoadUIImage()
{
............
}
void LoadTexture()
{
............
}
void LoadFont()
{
............
}
int main()
{
parallel_invoke( [] {
LoadUIImage(); },
[] { LoadTexture(); },
[] { LoadFont(); }
);
}
'VC++ 10 Concurrency Runtime' 카테고리의 다른 글
Parallel Patterns Library(PPL) - combinable (0) | 2009.10.28 |
---|---|
Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 마지막회 (0) | 2009.10.24 |
Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 2 (0) | 2009.09.17 |
Parallel Patterns Library(PPL) - parallel_for_each 알고리즘 (0) | 2009.09.12 |
Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 1 (1) | 2009.09.02 |