future 는 thread에서 연산된 결과 값을 전달 받기 위해 사용된다.
wait() / get()은 thread에서 return 또한 set_value() 함수가 호출될 때까지 무한정 대기한다.
wait_for()를 사용하면 일정 시간만큼 thread에서 값이 전달되기 기다리다, timout이 되면 block 상태가 해제된다.
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int main()
{
std::future<int> future = std::async(std::launch::async, [](){
std::this_thread::sleep_for(std::chrono::seconds(3));
return 8;
});
std::cout << "waiting...\n";
std::future_status status;
do {
status = future.wait_for(std::chrono::seconds(1));
if (status == std::future_status::deferred) {
std::cout << "deferred\n";
} else if (status == std::future_status::timeout) {
std::cout << "timeout\n";
} else if (status == std::future_status::ready) {
std::cout << "ready!\n";
}
} while (status != std::future_status::ready);
std::cout << "result is " << future.get() << '\n';
}
Line별로 자세히 살펴보도록 하자.
std::future<int> future = std::async(std::launch::async, [](){
std::this_thread::sleep_for(std::chrono::seconds(3));
return 8;
});
std::launch::async 정책으로 async()를 수행하는데, lamda 표현식을 사용하여 thread를 생성하였다. ( 3초를 sleep하고 8을 return )
std::future_status status;
do {
status = future.wait_for(std::chrono::seconds(1));
if (status == std::future_status::deferred) {
std::cout << "deferred\n";
} else if (status == std::future_status::timeout) {
std::cout << "timeout\n";
} else if (status == std::future_status::ready) {
std::cout << "ready!\n";
}
} while (status != std::future_status::ready);
이 섹션에서 핵심 코드라고 할 수 있다.
wait_for() 함수는 아래와 같은 return 값을 가진다.
wait_for()에서 second(1)을 전달하여 1초 대기하도록 선언하였다. 앞서 본 thread에서 3초 sleep 후 8을 return 하기에
do - while 1번째에는 timeout이 발생하게된다. (timeout 로그 출력)
이후 do - while 조건문에서 status가 ready가 아니므로, 다시 wait_for() 함수가 호출된다. thread는 아직 3초가 지나지 않았기에 다시 한번 timeout이 발생한다. (timeout 로그 출력)
다시 do - while 3번째에서 wait_for() 함수가 호출되어 1초를 wait하게 되는데, 이제는 thread가 3초 sleep에서 깨어나 8을 return 하게 된다.
그래서 wait_for() 함수는 ready를 리턴하게 된다.
do - while 문에서 status가 ready가 되어 do - while문을 빠져 나와 get() 함수를 통해 8을 출력하게 된다.
※ future_status::deferred 는 async()를 launch::deferred로 실행하였을 때, 리턴되는데, 어떤 경우에 사용하는지 아직 잘 모르겠다.
[C++] std::async - #2 (0) | 2021.08.27 |
---|---|
[C++] std::async - #1 (0) | 2021.08.27 |
[C++] promise & future (0) | 2021.08.24 |
[C++] thread 생성 방법들 (0) | 2021.08.23 |
[C++] thread 생성 및 인자 전달 (0) | 2021.08.23 |