멤버 변수

std::future_status ret = ft.wait_for(2s);

if (ret == std::future_status::ready) // 결과값이 준비 됨
	std::cout << "ready !" << std::endl;
else if (ret == std::future_status::timeout) // 시간 초과
	std::cout << "timeout !" << std::endl;
else // std::future_status::deferred(연산할 수행할 함수가 아직 시작 안됨. async() 함수에서 사용)
	std::cout < "deferred !" << std::endl;
void add(std::promise<int>&& p, int a, int b)
{
	std::this_thread::sleep_for(1s);
	p.set_value(a + b);
}

void consume(std::shared_future<int> sf)
{
	sf.get();
	std::cout << "finish foo" << std::endl;
}

int main()
{
	std::promise<int> pm;
	std::future<int> ft = pm.get_future();
	std::shared_future<int> sft = ft.share();

	// promise에서 바로 꺼낼수도 있다.
	// std::shared_future<int> sft = pm.get_future();

	std::thread t(add, std::move(pm), 10, 20);

	std::thread t1(consume, sft);
	std::thread t2(consume, sft);

	t.join();
	t1.join();
	t2.join();
}