본문 바로가기
💻 programming/c++

[c++] future

by 연구원-A 2020. 12. 15.
반응형

https://en.cppreference.com/w/cpp/thread/future

 

std::future - cppreference.com

template< class T > class future; (1) (since C++11) template< class T > class future ; (2) (since C++11) template<>          class future ; (3) (since C++11) The class template std::future provides a mechanism to access the result of asynchronous oper

en.cppreference.com

클래스 템플릿 (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

댓글