使用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中文網其他相關文章!