728x90
우리가 windows에서 특정 handle의 상태를 체크하기 위해 WaitForSingleObject 혹은 WaitForMultipleObjects 함수를 사용합니다. 이 함수를 통해 I/O 혹은 뮤텍스 등 특정 이벤트 처리에도 사용합니다.
하지만 이 함수를 사용하게 되면 바라보는 Handle(커널 오브젝트)가 Signaled 상태가 되는 지를 전달 받은 시간만큼 기다리는데 이때 Blocking 상태가 되게 됩니다. 이를 방지하기 위해 비동기 I/O와 같은 방식을 통해 해당 Handle에 대한 상태 체크를 대기하지 않고 다른 일을 처리할 수 있게 해줍니다.
위 링크에서 볼 수 있듯이 중첩 I/O, 완료 루틴을 사용하면 되지만 boost에서 제공하는 방법을 사용하는 것도 하나의 방법입니다.
boost는 C++에서 사용할 수 있는 필수 라이브러리를 제공해주는데 이 중 비동기 작업을 할 수 있는 Boost.Asio를 제공합니다.
Asio로 비동기 소켓 통신, 시리얼 통신 등을 사용할 수 있고 이 중에서 우리가 볼 것은 Boost.Asio.windows의 object_handle 입니다. 이를 통해 생성된 핸들 값을 받고 비동기 처리를 할 수 있습니다.
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/asio/windows/object_handle.hpp>
int main()
{
boost::asio::io_service io_service;
HANDLE handle = createEvent(NULL, FALSE, FALSE, NULL);
boost::asio::windows::object_handle asyncReceiveHandle(io, hRecieveEvent);
asyncReceiveHandle.async_wait([&] (const boost::system::error_code& error) {
});
io_service.run();
}
728x90
'Programming > C++' 카테고리의 다른 글
[C++] Template(2) (0) | 2023.09.22 |
---|---|
[C++] Template(1) (2) | 2023.09.19 |
[C++] std::forward_list, std::list (0) | 2023.07.18 |
[C++] std::array, std::vector (0) | 2023.07.12 |
[C++] 람다 함수 (0) | 2023.04.07 |