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;
}
돌아가기: 튜토리얼 페이지
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 튜토리얼 - Timer.2 소스 (0) | 2020.12.15 |
---|---|
Boost.Asio 튜토리얼 - Timer.1 소스 (0) | 2020.12.15 |
Boost.Asio 튜토리얼 - Timer.1 - 타이머를 동기식으로 사용 (0) | 2020.12.14 |
Boost.Asio 튜토리얼 (0) | 2020.12.14 |
Boost.Asio 사용 (0) | 2020.12.13 |