promise, future๋ฅผ ์ฌ์ฉํ ์์
promise์ future๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ ๊ฐ์ ์ฑ๋์ด ์์ฑ๋๋ค.
๋ฐ๋ผ์ ์ด ์ฑ๋์ ํ๋๋ง ์ ์ง๋์ด์ผ ํ๋ค.
์ฐ๋ ๋๋ก ์ธ์๋ก promise๋ฅผ ๋๊ธธ๋, ๋จ์ํ promise๋ฅผ ๋๊ธฐ๋ฉด copyํ๋ค๋ ๋ป์ด๋ฉฐ ์ด๋ 1:1์ ์ฑ๋ ๊ด๊ณ๊ฐ ์ด๊ธ๋จ์ ๋ปํ๋ค.
๊ทธ๋์ std::move๋ฅผ ์ด์ฉํ์ฌ r-value๋ก ์ธ์๋ฅผ ๋๊ฒจ์ค๋ค.
#include <iostream>
#include <future>
#include <thread>
using namespace std::chrono_literals;
void fn(std::promise<int> prm) {
std::this_thread::sleep_for(2s);
prm.set_value(33);
}
int main() {
std::promise<int> prm;
std::future<int> fut = prm.get_future();
std::thread t(fn, std::move(prm));
int num = fut.get();
std::cout << "num : " << num << std::endl;
t.join();
}
๊ฒฐ๊ณผ๊ฐ
num : 33
์์ธ ๋ฐ์ ์ํฉ
set_value์ set_exception์ ๋์์ ์ฌ์ฉํ ์๋ ์๋ค.
thread์์๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ๊ฐ ํ๋ค๋ค๋ ์ด์๊ฐ ์์ผ๋ promise, future๋ก๋ ์ด๋ฅผ ํธ๋ค๋ง ํ ์ ์์.
void fn(std::promise<int> prm) {
std::this_thread::sleep_for(2s);
try {
throw std::runtime_error("yllee error");
prm.set_value(33);
}
catch (...) {
prm.set_exception(std::current_exception());
}
//set_value๊ณผ set_exception์ ๋์์ ์ฌ์ฉํด์๋ ์๋๋ค.
}
int main() {
std::promise<int> prm;
std::future<int> fut = prm.get_future();
std::thread t(fn, std::move(prm));
while (fut.wait_for(0.2s) != std::future_status::ready)
{
std::cout << "Doing another things... 0.2sec.... " << std::endl;
}
try {
int num = fut.get();
std::cout << "num : " << num << std::endl;
}
catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
t.detach();
}
๊ฒฐ๊ณผ๊ฐ
๋๊ธ