728x90
반응형
C++11 이후에는 <future> 이 추가되었으며 future, promise를 통해서 값이나 예외를 저장할 수 있다.
생성하려는 Thread에 Promise를 매개변수로 전달해서 받아올 수 있다.
미래에(future) thread가 원하는 데이터를 돌려 주겠다고 약속(promise)하는 것이라고 할 수 있다.
#include <thread>
#include <future>
#include <iostream>
#include <chrono>
void ThreadFunc(std::promise<int>& retVal)
{
retVal.set_value(1);
}
int main()
{
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread th1(ThreadFunc, std::ref(p));
th1.join();
std::cout << f.get() << std::endl;
return 0;
}
promise를 선언할 때 템플릿 안에 타입을 바꿔서 사용할 수 있다.
promise <int> 대신에 promise <double>로 바꾸면 실수를 받아올 수 있다.
같은 형으로 future<int>도 future <double>로 바꿔줘야 한다.
promise 생성 → future 생성 → 객체 전달 → 함수내 반환 → 결과 값 확인
의 순서가 된다.
thread가 완전히 종료되면 future의 객체의 get()을 호출하여 값을 얻을 수 있다.
다른 방법으로는 thread 함수의 return을 사용할 수 있다.
#include <thread>
#include <future>
#include <iostream>
#include <chrono>
int ThreadFunc()
{
std::this_thread::sleep_for(std::chrono::seconds(3));
return 5; // 이 부분을 값으로 취한다.
}
int main()
{
std::future<int> f = std::async(ThreadFunc);
std::cout << f.get() << std::endl;
return 0;
}
위와 다르게 promise를 사용하지 않고, thread의 return 값을 async로 직접 받아서 사용할 수 있다.
예제에서 3초 대기를 주었는데, 실행 시 3초 후 return 된 값이 표시됨을 볼 수 있다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] atomic (6) | 2021.10.01 |
---|---|
[C++] explicit 키워드 (0) | 2021.10.01 |
[C++] 명시적 링크 (Explcit Linking) 시 GetProcAddress NULL 반환 (0) | 2021.07.29 |
[C++] std::string ↔ std::wstring (0) | 2021.06.09 |
[C++] Implicit Linking/Explicit Linking 장단점 (0) | 2021.04.09 |