Boost Asio를 사용한 비동기 쓰기: 인터리빙 방지
문제 설명:
애플리케이션에서 여러 클라이언트가 비동기적으로 메시지를 보낼 수 있는 경우 비동기 쓰기 작업을 방지하는 것이 중요합니다. 인터리빙. 이로 인해 메시지 순서가 잘못되거나 데이터가 왜곡될 수 있습니다.
해결책:
이 문제에 대한 간단하고 효과적인 해결책은 각 클라이언트에 대해 보낼 편지함 대기열을 구현하는 것입니다. 보낼 편지함 대기열은 전송해야 하는 메시지에 대한 버퍼 역할을 합니다.
작동 방식:
코드 예:
다음은 발신함 대기열을 사용하여 다음 작업을 수행하는 방법을 보여주는 단순화된 코드 예입니다. 쓰기 방지 인터리빙:
#include <boost/asio.hpp> #include <boost/bind.hpp> #include <deque> #include <iostream> #include <string> class Connection { public: Connection(boost::asio::io_service& io_service) : _io_service(io_service), _strand(io_service), _socket(io_service), _outbox() {} void write(const std::string& message) { _strand.post(boost::bind(&Connection::writeImpl, this, message)); } private: void writeImpl(const std::string& message) { _outbox.push_back(message); if (_outbox.size() > 1) { // Outstanding async_write, return return; } this->write(); } void write() { const std::string& message = _outbox[0]; boost::asio::async_write(_socket, boost::asio::buffer(message.c_str(), message.size()), _strand.wrap(boost::bind(&Connection::writeHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred))); } void writeHandler(const boost::system::error_code& error, const size_t bytesTransferred) { _outbox.pop_front(); if (error) { std::cerr << "Could not write: " << boost::system::system_error(error).what() << std::endl; return; } if (!_outbox.empty()) { // More messages to send this->write(); } } private: typedef std::deque<std::string> Outbox; private: boost::asio::io_service& _io_service; boost::asio::io_service::strand _strand; boost::asio::ip::tcp::socket _socket; Outbox _outbox; };
이점:
이 접근 방식은 여러 가지 이점을 제공합니다.
위 내용은 Boost Asio의 비동기 쓰기는 어떻게 메시지 인터리빙을 방지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!