기록은 기억을 이기고 시간보다 오래 남는다.

프로그래밍 언어/c++

[c++] Future 병렬 처리 방법

준_준 2024. 5. 29. 14:45

Future은 직렬 방식의 단순한 처리 방법에서 병렬로 동시에 처리 할 수 있도록 하는 기능이다.

C++11에서 추가된 std::future은 비동기 계산을 가능하게 해주는 기능입니다.

이를 통해 현재 스레드에서 계산이 끝나지 않은 작업을 다른 스레드에서 계속 수행할 수 있습니다.

결론)

mutax, condition_variable까지 가지 않고 단순한 애들을 처리할 수 있는 (일회성으로 일어나는)\
future 객체를 만드는 방법은 여러가지 방법이 있음
특히나 , 한 번 발생하는 이벤트에 유용하다.
1)async = 원하는 함수를 비동기적으로 실행
2)promise =  결과무를 promise를 통해 future로 받아줌
3)packaged_task = 원하는 함수의 실행 결과를 packaged_task를 통해 future로 받아줌

#include"pch.h"
#include"CorePch.h"
#include <iostream>
#include <thread>
#include <atomic>
#include <future>

int64 Calculate()
{
    int64 sum = 0;
    for (int32 i = 0; i < 100000; i++)
        sum += i;
}
void PromiseWorker(std::promise<string>&& promise)
{
    promise.set_value("Secret Message");
}
void TaskWorker(std::packaged_task<int64(void)>&& task)
{
    task();
}
int main()
{   //동기(synchronous) 실행
    int64 sum = Calculate();
    cout << sum << endl;

    thread t(Calculate);
    //1)deferred-> lazy evaluation 지연해서 실행하세요
    //2)async-> 별도의 쓰레드를 만들어서 실행하세요 사실상 멸티 쓰레드 환경이 됨 컬큐를 병렬로 실행함
    //3)deferred |async-> 둘 중 알아서 골라주세요
    //언젠가 미래에 결과물을 뱉어 줄꺼야! 일종의 약속을 함 셈
    std::future<int64> future = std::async(std::launch::async, Calculate); 

    
    future.wait_for(1ms);// 1ms 만 기다려 보겠다
    
    int64 sum = future.get(); // 결과물이 이제서야 필요하다.
    // wai_for와 get 만 기억하고 있으면 됨 당장은
   


    //밑은 조금 디테일
    class Knight
    {
    public:
        int64 GetHp() { return 100; }

    };
    Knight knight;
    std::future<int64> future2 = std::async(std::launch::async, &Knight::GetHp, knight);

    //std::promise
    {
        //미래(std::future)에 결과물을 반환해줄꺼라 약속 해줘 계약서 같은느낌
        std::promise<string> promise;
        std::future<string> future = promise.get_future();
        
        thread t(PromiseWorker, std::move(promise));
        string message = future.get(); //future.get 은 딱 한번만 호출해야
        cout << message << endl;
    }

    //std::packaged_task
    {
        std::packaged_task<int64(void)> task(Calculate);
        std::future<int64> future = task.get_future();

        std::thread t(TaskWorker, std::move(task));

        int64 sum = future.get();
        cout << sum << endl;

        t.join();
    }

}

//결론)
//mutax, condition_variable까지 가지 않고 단순한 애들을 처리할 수 있는 (일회성으로 일어나는)\
//future 객체를 만드는 방법은 여러가지 방법이 있음
//특히나 , 한 번 발생하는 이벤트에 유용하다.
//1)async = 원하는 함수를 비동기적으로 실행
//2)promise =  결과무를 promise를 통해 future로 받아줌
//3)packaged_task = 원하는 함수의 실행 결과를 packaged_task를 통해 future로 받아줌

 

반응형