상세 컨텐츠

본문 제목

[C++] promise & future

c++

by 빨간눈동자 2021. 8. 24. 23:17

본문

반응형

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++' 카테고리의 다른 글

[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

관련글 더보기