main()에서 생성한 thread의 실행 결과를 다시 전달 받기 위해서는 promise와 future 객체를 사용한다.
아래 예제를 간단히 살펴보도록 하자.
#include <vector>
#include <thread>
#include <future>
#include <numeric>
#include <iostream>
#include <chrono>
void accumulate(std::vector<int>::iterator first,
std::vector<int>::iterator last,
std::promise<int> accumulate_promise)
{
int sum = std::accumulate(first, last, 0);
accumulate_promise.set_value(sum); // Notify future
}
int main()
{
// Demonstrate using promise<int> to transmit a result between threads.
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6 };
std::promise<int> accumulate_promise;
std::future<int> accumulate_future = accumulate_promise.get_future();
std::thread work_thread(accumulate, numbers.begin(), numbers.end(),
std::move(accumulate_promise));
// future::get() will wait until the future has a valid result and retrieves it.
// Calling wait() before get() is not needed
//accumulate_future.wait(); // wait for result
std::cout << "result=" << accumulate_future.get() << '\n';
work_thread.join(); // wait for thread completion
}
중요한 코드만 살펴보면,
std::promise<int> accumulate_promise;
>> promise 객체를 생성하고
std::future<int> accumulate_future = accumulate_promise.get_future();
>> feature 객체로 promise객체.get_future()의 return 값을 받아 온다.
std::thread work_thread(accumulate, numbers.begin(), numbers.end(), std::move(accumulate_promise));
>> thread 생성 시, promise 객체를 전달한다.
accumulate_promise.set_value(sum); // Notify future
>> accumulate 함수에서는 내부에서 계산되어진 값을 sum에 저장하고, 전달 받은 promise 객체의 set_value()를 통해 main으로 전달하게 된다.
std::cout << "result=" << accumulate_future.get() << '\n';
>> main 함수에서는 future 객체.get() 함수를 통해 thread에서 값을 return 해주기를 기달린다. set_value()를 하면 get()을 통해 값을 전달 받는다.
위 예제는 thread에서 전달 받을 값이 있을 때이다.
만약 전달 받을 값이 없고, 단순히 thread에서 계산이 완료되기를 기다린 후 main 함수가 실행하길 원한다면 아래 예제를 참고하자.
#include <vector>
#include <thread>
#include <future>
#include <numeric>
#include <iostream>
#include <chrono>
void do_work(std::promise<void> barrier)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "do_work" << std::endl;
barrier.set_value();
}
int main()
{
// Demonstrate using promise<void> to signal state between threads.
std::promise<void> barrier;
std::future<void> barrier_future = barrier.get_future();
std::thread new_work_thread(do_work, std::move(barrier));
barrier_future.wait();
std::cout << "main" << std::endl;
new_work_thread.join();
}
중요한 코드만 살펴보자.
barrier_future.wait();
future객체의 wait() 함수 또한 set_value() 함수가 호출될 때까지 기다린다. 이후 thread에서 전달된 값이 있다면 get() 함수를 통해 값을 받아오면 된다.
※ future 객체의 get()를 사용하면 wait()를 사용하지 않고 바로 get()해도 된다.
[C++] std::future - wait_for (0) | 2021.08.28 |
---|---|
[C++] std::async - #2 (0) | 2021.08.27 |
[C++] std::async - #1 (0) | 2021.08.27 |
[C++] thread 생성 방법들 (0) | 2021.08.23 |
[C++] thread 생성 및 인자 전달 (0) | 2021.08.23 |