반응형
https://en.cppreference.com/w/cpp/thread/future
클래스 템플릿 (class template)인 std::future는 비동기적 수행 (asynchronous operation) 에 대한 결과에 접근하는 메커니즘을 제공합니다.
- std::async, std::packaged_task, std::promise 등에 의한 결과로 생성된 비동기적 수행들은 std::future 객체를 생성할 수 있습니다
- 비동기적 동작을 만드는 주체가 동작을 완료하면 std::promise::set_value 함수를 통해 std::future에 값을 연결합니다.
- wait (wait_for, wait_until) 을 통해 결과를 대기하고, get 함수를 통해 비동기적 수행에 대한 값을 얻을 수 있습니다.
get함수 중복 호출
future에서 get을 호출하면, 비동기적 수행에 대한 결과가 이동 (move) 됩니다. 따라서 절대 get을 두 번 호출해서는 안됩니다.
valid 함수 이용하기
valid 멤버 함수를 이용해 future에 링크된 객체가 공유 가능한 상태인지 확인해야 합니다.
// future::valid
#include <iostream> // std::cout
#include <future> // std::async, std::future
#include <utility> // std::move
int get_value() { return 10; }
int main ()
{
std::future<int> foo,bar;
foo = std::async (get_value);
bar = std::move(foo);
if (foo.valid())
std::cout << "foo's value: " << foo.get() << '\n';
else
std::cout << "foo is not valid\n";
if (bar.valid())
std::cout << "bar's value: " << bar.get() << '\n';
else
std::cout << "bar is not valid\n";
return 0;
}
예제 코드
#include <iostream>
#include <future>
#include <thread>
int main()
{
// future from a packaged_task
std::packaged_task<int()> task([]{ return 7; }); // wrap the function
std::future<int> f1 = task.get_future(); // get a future
std::thread t(std::move(task)); // launch on a thread
// future from an async()
std::future<int> f2 = std::async(std::launch::async, []{ return 8; });
// future from a promise
std::promise<int> p;
std::future<int> f3 = p.get_future();
std::thread( [&p]{ p.set_value_at_thread_exit(9); }).detach();
std::cout << "Waiting..." << std::flush;
f1.wait();
f2.wait();
f3.wait();
std::cout << "Done!\nResults are: "
<< f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
t.join();
}
반응형
'💻 programming > c++' 카테고리의 다른 글
[c++] optional (0) | 2020.12.15 |
---|---|
[c++] move (0) | 2020.12.15 |
[c++] perfect forwarding (완벽한 전달) (0) | 2020.12.15 |
[c++] async (0) | 2020.12.15 |
[c++] packaged task (0) | 2020.12.15 |
댓글