Post List

2015년 1월 22일 목요일

Thread를 이용하여 비동기 작업 처리하기 (packaged_task)

packaged_task (Visual Studio 2012부터 사용가능)

async를 이용하면 비동기로 작업을 처리 할 수 있지만, 몇가지 문제가 있다.

- 다른 thread에서 실행되는 것을 보장하지 않는다.
- VS2012에서는 프로그램 종료시까지 thread 자원을 release 하지 않았다. (VS2013 이후에는 해결)

그래서 아래와 같은 경우 async는 좋지 않는 선택이다.

- 다른 thread에서 실행되어야 할 경우
- 결과값을 얻을 때 thread가 소멸 되어야 할 경우
- 작업을 수행한 후 결과를 나중에 얻어야 할 경우

(물론 async를 사용하는게 성능과 시스템자원의 효율적인 사용에는 더 좋은 선택이다.)

이럴 땐 packaged_task 와 futurethread를 조합하면 가능하다.
(future / async 를 이용하여 구현한 대부분의 경우에 적용이 가능하다.)

#include <iostream>
#include <thread>
#include <future>
#include <utility>

using std::cout;
using std::endl;
using std::vector;
using std::packaged_task;
using std::future;
using std::thread;
using std::move;

std::vector<int> GetTestVector(int p_nStart, int p_nNum)
{
    vector<int> V;

    for (int i = 0; i < p_nNum; ++i)
    {
       V.push_back(i + p_nStart);
    }

    return V;
}

void main()
{
    packaged_task<vector<int>(int, int)> task(&GetTestVector);
    future<vector<int>> f = task.get_future();
    thread t(move(task), 21, 7);

    t.detach();
    auto result = f.get();

    for (auto i : result)
    {
       cout << "Get Values : " << i << endl;
    }

}

promise/future 의 topic에서 사용한 예제를 그대로 packaged_task로 바꿔보았다.

댓글 없음:

댓글 쓰기