경우에따라 가벼운상황에서 순서를 보장해서 이벤트를 전달할때 사용한다.
future객체를 이용한 3가지 방식을 소개한다.
1. 비동기 방식으로 실행할 함수를 만들어서 결과물을 future객체의 get을 통해 추출하는 것
2. future를 세팅할수있는 promise객체를 만들어 스레드 소유권을 넘겨 future로 받아오는 것
3. 원하는 함수의 실행 결과를 packaged_task를 통해 future로 받아줌
아래 예제는 단순히 특정 숫자의 합을 구하는 Calculate를 호출하는 예제.
직접 함수를 호출해서 값을 구하는 방법
직접 별도 스레드를 만들어 수행하는 방법
//
#include <mutex>
#include <atomic>
#include <chrono>
#include <thread>
#include <iostream>
#include <queue>
#include <windows.h>
#include <future>
using namespace std;
__int64 sum;
// Calculate() 함수로, 1부터 10000까지의 합을 구하려고한다.
int Calculate()
{
__int64 sum = 0;
for(int i = 0; i < 10'000; ++i)
{
sum += i;
}
return sum;
}
int main()
{
// 1. 직접 함수 호출
//sum = Calculate();
//cout << sum << '\\n';
// 2. 스레드로 실행
//thread t(Calculate());
//t. join
// 3. std::future 사용
{
// 1) deferred -> lazy evaluation 지연해서 (본인스레드에서 동기) 실행
// 2) async -> 별도의 스레드를 만들어 실행
// 3) deferred | async -> 알아서 골라서 실행
// 4) 전달값 없음 -> 3번과 동일
std::future<__int64> future = std::async(std::launch::async, Calculate);
// TODO
std::future_status status = future.wait_for(1ms);
if (status == std::future_status::ready)
{
}
//future.wait(); // 이젠 정말 결과물이 필요할떄..
__int64 sum = future.get(); // 결과물 가져오기
}
return 0;
}
1-1) deferred -> lazy evaluation 지연해서 (본인스레드에서) 실행 1-2) async -> 별도의 스레드를 만들어 실행 1-3) deferred | async -> 알아서 골라서 실행 1-4) 전달값 없음 → 3번과 동일
표준 라이브러리 구현체 쪽에서 결정된다. OS가 직접적으로 판단하는 것은 아니며 표준 라이브러리가 내부 정책 등을 보고 선택한다.