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로 받아줌
반응형
'프로그래밍 언어 > c++' 카테고리의 다른 글
[c++] fetch_add() 함수 (0) | 2024.05.29 |
---|---|
[C/C++] Stack in c++ (기본 사용법, 예제) (1) | 2024.05.29 |
[c++] 대문자, 소문자 구분 하는 방법 (islower, isupper) (0) | 2023.05.03 |
[C++]size_t 와 string::npos란 무엇일까? (0) | 2023.04.29 |
[C++] pow, sqrt 함수란?(루트함수, 제곱, 제곱근) (0) | 2023.04.28 |