프로그래밍/Parallel Programming

병렬 프로그래밍 Parallel Programming - task_group

nanze 2021. 12. 20. 22:52
반응형

이전 정리글은

2021.12.18 - [프로그래밍/Parallel Programming] - 병렬 프로그래밍 Parallel Programming - when_all, when_any

 

자 ~! 오늘은 3번째 정리시간이다. 오늘은 task_group 과 structed_task_group 에 대해서 정리해보자. 이 두 클래스는 task를 그룹으로 관리하기 편한 기능을 제공한다. 하나씩 알아가보자.! 

structed_task_group

 우선 structed_task_group 에 대해서 알아보자. 일단 모다? 코드부터 ㅋ

#include <ppl.h>
#include <iostream>

int _tmain()
{
    auto taskone = concurrency::make_task(
    	[]{ wcout << L"task one. !" << endl; }
    );
    auto tasktwo = concurrency::make_task(
    	[]{ wcout << L"task two. !" << endl; }
    );
    auto taskthree =  concurrency::make_task(
        []{ wcout << L"task three. !" << endl; }
    );
    
    concurrency::structed_task_group sttaskgroup;
    
    sttaskgroup.run(taskone);
    sttaskgroup.run(tasktwo);
    sttaskgroup.run(taskthree);
    sttaskgroup.wait();
    
    return 0;
}

 위 코드를 보면 make_task 함수를 사용하는 것을 볼 수 있다. 이것은 task_handle 을 반환하는 함수이다. create_task 함수와는 다르게 생성과 함께 바로 실행되지 않으면 task_group 의 run 함수를 통해서 실행될 수 있다. 한마디로 task_group 을 사용하기 위한 것이라 생각하면 될 것 같다. 위의 코드는 structed_task_group 의 run 함수를 통해서 taskone, tasktwo, taskthree 작업을 실행하고 wait 함수를 통해서 task 작업이 종료되기를 대기하는 코드이다. run 과 wait 말고도 run_and_wait, cancel, is_canceling 함수를 제공한다. 각 기능은 함수명에서 유추할 수 있을 것이다. ㅎ,.ㅎ 이와 같은 함수는 task_group 에서도 제공한다. 하지만 structed_task_group 클래스 사용에 유념해야 할 것은 해당 클래스는 thread-safe 하지 않다는 것이다.  또하나 공부하면서 알게된 것은 제공 함수 중에서 cancel, is_canceling 함수는 여러 스레드에서 사용되도 문제가 없다는 것이다. 

 

task_group

 자 이번에는 task_group 에 대해서 알아보자. 앞서 정리한 것처럼 task_group 은 structed_task_group 과는 달리 thread-safe 하다.  그렇기 때문에 task_group 에서 제공하는 함수들을 각기 다른 스레드에서 사용할 수 있다. 또 다른점은 무엇일까?  task_group 은 run 함수에서 인자로 task_handle 말고도 함수 원형 또한 받을 수 있다. structed_task_group 의 run 함수는 task_handle 만 가능하다. run_and_wait 같은 경우에는 양쪽 클래스 모두 다 가능하다. 

#include <ppl.h>
#include <iostream>

int _tmain()
{
    auto taskone = concurrency::make_task(
    	[]{ wcout << L"task one. !" << endl; }
    );
    auto tasktwo = concurrency::make_task(
    	[]{ wcout << L"task two. !" << endl; }
    );
    auto taskthree =  concurrency::make_task(
        []{ wcout << L"task three. !" << endl; }
    );
    
    concurrency::task_group taskgroups;
    
    taskgroups.run(taskone);
    taskgroups.run(tasktwo);
    taskgroups.run(taskthree);
    taskgroups.run( //structed_task_group 에서는 불가능
    []{ wcout << L"task four. !" << endl; }
    );
    taskgroups.run([&taskgroups](){
    		taskgroups.run([] {  //structed_task_group 의 경우에는 다른 스레드 안에서 run 사용X
            		wcout << L"task five's child !" << endl; 
            	}
            );
    	}
    );
    taskgroups.wait();
    
    return 0;
}

 위 코드는 앞서 설명한 것을 보여주고 있다. 

 밤이 벌써 깊었다. 내일은 부스터 샷을 맞아야 하기에 컨디션 조절이 필요하다. 오늘 정리는 여기까지..

 

다음 정리글은

2021.12.22 - [프로그래밍/Parallel Programming] - 병렬 프로그래밍 Parallel Programming - parallel_for

반응형