C++

Futrue

춤추는수달 2022. 1. 27. 22:14

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