c++ 11에 공식적으로 추가된 내용.
#include <future>
동기방식 synchronous : 오래 걸리면 비동기로 하는게 좋다.
조금 오래걸리는 함수 한 번만 실행할건데 그걸 가지고 스레드를 만드는건 좀 낭비같다는 생각이 든다. 즉1회성 이벤트에 유용하다. 이런 상황에서 가볍게 실행가능한 것이 future 이다. 말하자면 '애기 스레드 만들기' 라고 할 수 있다.
std::future<int64> future = std::async(std::launch::async, Calculate); //async는 defered라는 선택지도 있음.
std::future future = std::async(std::launch::async, &Knight::GetHp, knight1); // 함수가 멤버함수일 경우 이렇게 씀.
int64 sum = future.get(); // 이제는 결과물이 필요하다. 결과물이 나올 때까지 기다림.
std::future_status = future.wait_for(1ms);
if(status == future_status::ready)
future.wait();// 끝날 때까지 기다리기. 사실 get이랑 결과는 똑같음.
옵션 :
deferred : lazy evauation , 지연해서 실행. 나중에 실행해줘.
async : 별도의 쓰레드 만들어줘
deferred | async : 둘 중 알아서 골라줘
promise
std::promise<string> promise; // 미래에 결과물을 반환 해줄거라고 약속해
std::future<string> future = promise.get_future();
thread t(PromiseWorker, std::move(promise));
promise.set_value("asdf");
future.get();
packaged task
std::packaged_task<int64(void)> task(Calculate);
std::future future = task.get_future();
task(); // 리턴값을 future을 통해 받아올 수 있음.
std::thread t(TaskWorker, std::move(task));
future.get();
'C++' 카테고리의 다른 글
TLS(Thread Local Storage) (0) | 2022.02.01 |
---|---|
메모리 모델 (0) | 2022.02.01 |
조건 변수(Condition Variable) (0) | 2022.01.27 |
멀티 쓰레드 Lock 구현 (0) | 2022.01.26 |
멀티 쓰레드 (0) | 2022.01.24 |