경우에따라 가벼운상황에서 순서를 보장해서 이벤트를 전달할때 사용한다.

future객체를 이용한 3가지 방식을 소개한다.

1. 비동기 방식으로 실행할 함수를 만들어서 결과물을 future객체의 get을 통해 추출하는 것

2. future를 세팅할수있는 promise객체를 만들어 스레드 소유권을 넘겨 future로 받아오는 것

3. 원하는 함수의 실행 결과를 packaged_task를 통해 future로 받아줌

1. 함수와 future객체 활용

아래 예제는 단순히 특정 숫자의 합을 구하는 Calculate를 호출하는 예제.

직접 함수를 호출해서 값을 구하는 방법

직접 별도 스레드를 만들어 수행하는 방법

  1. future를 사용
//
#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;
}

future 옵션

1-1) deferred -> lazy evaluation 지연해서 (본인스레드에서) 실행 1-2) async -> 별도의 스레드를 만들어 실행 1-3) deferred | async -> 알아서 골라서 실행 1-4) 전달값 없음 → 3번과 동일

deferred | async, 알아서 결정한다?

표준 라이브러리 구현체 쪽에서 결정된다. OS가 직접적으로 판단하는 것은 아니며 표준 라이브러리가 내부 정책 등을 보고 선택한다.