C++에서는 시간이 오래 걸리는 작업(파일 읽기)을 쓰레드를 만들어 처리할 수 있다.

프로그램의 실행이 한 갈래가 아니라 여러 갈래로 갈라져서 동시에 진행되는 것을 비동기적 실행이라고 부른다.

 

C++11 표준 라이브러리는 간단한 비동기적 실행을 할 수 있게 해주는 도구를 제공한다.

 

std::promise와 std::future

#include <future>
#include <iostream>
#include <string>
#include <thread>
using std::string;

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();
}

 

 

future에서 get을 호출하면 설정된 객체가 이동하기 때문에 두 번 호출해서는 안된다.

 

future에 예외도 전달할 수 있다.

 

shared_future

여러 개의 다른 쓰레드에서 future를 get할 필요가 있을 때 사용

future와 달리 복사가 가능하고, 복사본들이 모두 같은 객체를 공유하게 된다.

 

packaged_task

C++에서는 promise-future 패턴을 비동기적 함수(Callable)의 리턴값에 간단히 적용할 수 있는 package_task라는 것을 지원한다.

 

std::async

쓰레드를 명시적으로 생성하지 않아도 됨

std::async에 함수를 전달하면 알아서 쓰레드를 만들어 전달된 함수를 비동기적으로 실행하고, 결과값을 future에 전달함.

 

참조: 

https://modoocode.com/284

'C++' 카테고리의 다른 글

C++ 키워드 정리  (0) 2022.08.27
C++ Callable  (0) 2022.08.26
C++ RAII와 스마트포인터  (0) 2022.08.26
C++ 가상 함수, virtual 소멸자, 가상 함수 테이블, 추상 클래스  (0) 2022.08.25
C++ 템플릿, 함수 객체(Functor)  (0) 2022.08.25

+ Recent posts