async를 이용하면 비동기로 작업을 처리 할 수 있지만, 몇가지 문제가 있다.
- 다른 thread에서 실행되는 것을 보장하지 않는다.
-
그래서 아래와 같은 경우 async는 좋지 않는 선택이다.
- 다른 thread에서 실행되어야 할 경우
- 결과값을 얻을 때 thread가 소멸 되어야 할 경우
- 작업을 수행한 후 결과를 나중에 얻어야 할 경우
(물론 async를 사용하는게 성능과 시스템자원의 효율적인 사용에는 더 좋은 선택이다.)
이럴 땐 packaged_task 와 future, thread를 조합하면 가능하다.
(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로 바꿔보았다.
댓글 없음:
댓글 쓰기