Boost C++ Libraries/Boost.Asio

Boost.Asio 개요 - C++ 2011 지원 - 이동 가능 I/O 개체

까마귀75 2020. 12. 13. 00:53
728x90
반응형

이동 가능 I/O 개체 (Movable I/O Objects)

이동 지원이 가능할(rvalue 참조를 통해) 경우, Boost.Asio는 소켓, 직렬 포트, POSIX 디스크립터와 Windows 핸들의 이동 생성 및 할당을 허용한다.

 

이동 지원을 허용하면 다음과 같은 코드를 작성할 수 있다:

tcp::socket make_socket(io_context& i)
{
  tcp::socket s(i);
  ...
  std::move(s);
}

 

또는:

class connection : public enable_shared_from_this<connection>
{
private:
  tcp::socket socket_;
  ...
public:
  connection(tcp::socket&& s) : socket_(std::move(s)) {}
  ...
};

...

class server
{
private:
  tcp::acceptor acceptor_;
  ...
  void handle_accept(error_code ec, tcp::socket socket)
  {
    if (!ec)
      std::make_shared<connection>(std::move(socket))->go();
    acceptor_.async_accept(...);
  }
  ...
};

 

다음 사항뿐 아니라:

std::vector<tcp::socket> sockets;
sockets.push_back(tcp::socket(...));

 

경고 : 보류 중인(pending) 비동기 작업이 있는 동안 이러한 개체의 이동을 막을 수는 없지만, 그렇게 하는 것(개체를 이동하는것)은 좋은 생각이 아니다. 특히, async_read()와 같이 구성된 작업은 스트림 개체에 대한 참조를 저장한다. 구성된 작업중에 이동한다는 것은 구성된 작업이 이동된 개체에 대해 접근을 시도할 수 있음을 의미한다.

 

이동 지원은 -std=c++0x 또는 -std=gnu++0x 컴파일러 옵션을 사용하는 경우 g++ 4.5 이상에 대해 자동으로 활성화된다. BOOST_ASIO_DISABLE_MOVE를 정의하여 비활성화하거나 BOOST_ASIO_HAS_MOVE를 정의하여 다른 컴파일러에 대해 명시적으로 활성화할 수 있다. 이러한 매크로는 이동 가능 핸들러(Movable Handlers)의 사용 가능 여부에도 영향을 미친다는 점에 유의한다.

 

 

C++ 2011 지원  Boost.Asio 개요  Boost.Asio 홈

728x90
반응형