멤버 변수
- get: 결과를 꺼내기 (값이 셋팅될때까지 wating) - 한번만 사용할 수 있다.
- wait: 결과값 이 준비 될 때 까지 대기
- wait_for: 주어진 시간 만큼 대기
- wait_until: 주어진 시간 까지 대기
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;
- share: shared_future 얻기
- 여러 쓰레드에서 사용하고 싶을때, 기존 future는 복사가 안되기 때문에 shared_future를 사용.
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();
}