Boost Asio での非同期書き込み呼び出しのインターリーブ
Boost ASIO では、複数のメッセージが急速に連続して送信される場合、async_write 呼び出しがインターリーブされることがあります。これにより、予期しない動作やデータの破損が発生する可能性があります。この問題を回避する簡単な解決策は、クライアントごとに送信キューを維持することです。
送信キューの使用
送信キューを使用すると、次のことが保証されます。メッセージは受信した順序で送信されます。新しいメッセージが到着すると、キューに追加されます。 async_write ハンドラーはキューのサイズをチェックし、送信するメッセージがまだある場合は新しい async_write オペレーションを開始します。
実装例
これは、非同期書き込みのサンプル実装です。送信キューを使用するハンドラー:
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(); } }
この例では、writeHandler が開始されます。 _outbox にさらにメッセージがある場合は、新しい async_write 操作。
送信トレイへのアクセスの保護
_outbox へのアクセスを保護するには、ストランドまたは同期を使用する必要があります。原生的。ストランドにより、_outbox にアクセスするコードを一度に 1 つのスレッドだけが実行できるようになり、競合状態が防止されます。
重要なポイント
以上がBoost Asio での非同期書き込み呼び出しインターリーブを防ぐ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。