728x90

우리가 windows에서 특정 handle의 상태를 체크하기 위해 WaitForSingleObject 혹은 WaitForMultipleObjects 함수를 사용합니다. 이 함수를 통해 I/O 혹은 뮤텍스 등 특정 이벤트 처리에도 사용합니다. 

 

열혈 TCP/IP 19-3. 커널 오브젝트의 두 가지 상태

커널 오브젝트의 두 가지 상태 - non-signaled 상태 : 이벤트가 발생하지 않은 상태 - signaled 상태 : 이벤트가 발생한 상태, 해당 리소스가 특정 상황에 도달한 상태 - 두 상태를 통해 리소스의 상황을

1d1cblog.tistory.com

하지만 이 함수를 사용하게 되면 바라보는 Handle(커널 오브젝트)가 Signaled 상태가 되는 지를 전달 받은 시간만큼 기다리는데 이때 Blocking 상태가 되게 됩니다. 이를 방지하기 위해 비동기 I/O와 같은 방식을 통해 해당 Handle에 대한 상태 체크를 대기하지 않고 다른 일을 처리할 수 있게 해줍니다.

 

윈도우즈 시스템 프로그래밍 - 19. 비동기 I/O와 APC(3)

중첩 I/O의 구현 - I/O를 할 리소스(파일, 파이프 등)을 만들 때 FILE_FLAG_OVERLAPPED를 인자로 주고 I/O를 하는데 OVERRAPED 구조체의 내용으로 비동기 I/O로 진행을 하고 I/O 연산이 끝나면 Event가 Signaled 상

1d1cblog.tistory.com

위 링크에서 볼 수 있듯이 중첩 I/O, 완료 루틴을 사용하면 되지만 boost에서 제공하는 방법을 사용하는 것도 하나의 방법입니다.

 

boost는 C++에서 사용할 수 있는 필수 라이브러리를 제공해주는데 이 중 비동기 작업을 할 수 있는 Boost.Asio를 제공합니다. 

 

Boost.Asio

Copyright © 2003-2020 Christopher M. Kohlhoff Boost.Asio is a cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach. Overview An overview of the featu

think-async.com

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

+ Recent posts