Boost C++ Libraries/Boost.Asio

Boost.Asio 튜토리얼 - Timer.2 - 타이머를 비동기식으로 사용

까마귀75 2020. 12. 15. 09:38
728x90
반응형

Timer.2 타이머를 비동기식으로 사용 (Using a timer asynchronously)

이 튜토리얼 프로그램은 타이머에서 비동기 대기를 수행하도록 튜토리얼 Timer.1에서 사용한 프로그램을 수정하여 asio의 비동기 콜백 기능을 사용하는 방법을 보여준다.

 

#include <iostream>
#include <boost/asio.hpp>

 

asio의 비동기 기능을 사용한다는 것은 비동기 작업 완료 후 호출되는 콜백 함수를 갖는다는 것을 의미한다. 이 프로그램에서는 비동기 대기가 끝나면 호출되는 print라는 함수를 정의한다.

 

void print(const boost::system::error_code& /*e*/)
{
  std::cout << "Hello, world!" << std::endl;
}

int main()
{
  boost::asio::io_context io;

  boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));

 

다음으로 튜토리얼 Timer.1에서와 같이 블록 대기를 수행하는 대신, 비동기 대기를 수행하기 위해 steady_timer::async_wait() 함수를 호출한다. 이 함수를 호출할 때 위에서 정의한 print 콜백 핸들러를 인수로 전달한다.

 

  t.async_wait(&print);

 

마지막으로 io_context 개체에서 io_context::run() 멤버 함수를 호출해야 한다.

 

asio 라이브러리는 현재 io_context::run()을 호출한 스레드에서만 콜백 핸들러가 호출되도록 보장한다. 따라서 io_context::run() 함수는 비동기 대기 완료를 위한 콜백이 호출되지 않는 한 결코 호출되지 않는다.

 

io_context::run() 함수는 "work(작업)"이 있는 동안 계속 실행된다. 이 예제에서, 작업은 타이머에서 비동기 대기이므로 타이머가 만료되거나 콜백이 완료될 때까지 반환되지 않는다.

 

io_context::run() 호출 전, io_context에 해야할 일을 제공하는 것이 중요하다. 예를 들어, 위에서 steady_timer::async_wait()에 대한 호출을 생략한다면 io_context는 할 일이 없었을 것이고, 결과적으로 io_context::run()은 즉시 반환할 것이다.

 

  io.run();

  return 0;
}

 

전체 소스 보기

 

돌아가기: 튜토리얼 페이지

 

이전: Timer.1 - 타이머를 동기식으로 사용

다음: Timer.3 - 핸들러에 대한 바인딩 인수

 

원본 링크

728x90
반응형