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)의 사용 가능 여부에도 영향을 미친다는 점에 유의한다.
728x90
반응형
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 개요 - C++ 2011 지원 - 가변 길이 템플릿 (0) | 2020.12.13 |
---|---|
Boost.Asio 개요 - C++ 2011 지원 - 이동 가능 핸들러 (0) | 2020.12.13 |
Boost.Asio 개요 - C++ 2011 지원 (0) | 2020.12.13 |
Boost.Asio 개요 - SSL (0) | 2020.12.13 |
Boost.Asio 개요 - Windows 전용 기능 - 객체 핸들 (0) | 2020.12.12 |