티스토리 뷰

IT/DEV

[C++] std future, promise | C++17

ttoogi 2023. 1. 30. 11:46

for concurrency.

future - promise 는 한 세트다! object.

쓰레드의 아규먼트로 promise로 받는다.

promise 오브젝트로 set_value 를 한다.

promise 오브젝트로 아규먼트 전달 시 copy 가 일어나는데 promise 는 카피가 불가능한 오브젝트임. R value 로 변경해서 넘겨준다 (std::move() 이용)

 

[C++11] Rvalue Reference #2 - Move Semantics

Move Semantics Move Semantics란 객체의 리소스(동적으로 할당 된 메모리와 같은)를 또 다른 객체로 전송(이동)하는 것을 의미합니다. 앞에서 살펴보았던 Rvalue 참조자는 Move Semantics의 구현을 가능하게

effort4137.tistory.com

 

Example 1 - promise - futere pair

void worker(std::promise<string>* p) {
  // 약속을 이행하는 모습. 해당 결과는 future 에 들어간다.
  p->set_value("some data");
}

int main() {
  std::promise<string> p;

  // 미래에 string 데이터를 돌려 주겠다는 약속.
  std::future<string> data = p.get_future();

  std::thread t(worker, &p);

  // 미래에 약속된 데이터를 받을 때 까지 기다린다.
  data.wait();

  // wait 이 리턴했다는 뜻이 future 에 데이터가 준비되었다는 의미.
  // 참고로 wait 없이 그냥 get 해도 wait 한 것과 같다.
  std::cout << "받은 데이터 : " << data.get() << std::endl;

  t.join();
}

promise - future 는 성능은 좋지 않다.

내부에서 heap에 메모리를 할당하고 CV, mutex, reference counter 등 관리 작업이 있다.

 

Example 2 - thread 아규먼트로 promise 오브젝트 전달

void fn(std::promise<int> prm)
{
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    prm.set_value(42);
}

int main() {
    std::promist<int> prms;
    std::future<int> fut = prms.get_future();

    std::thread t(fn, std::move(prms));
    int num = fut.get();

    std::cout << "num: " << num << std::encl;
    t.join();
}

future.get() 은 blocking 함수다.

f=