現在、boost::async_write を使用して大きなサイズのバッファ (約 50KB) を一度に送信しています。その結果、サーバー側の 20 バッファーごとに約 1 つの破損したバッファーを受信しています。
私のコードはこのようなものです。エラー処理とその他の詳細は省略されています。
bool socket_available = true;
const_buffer *buffer;
// will be called frequently in a while loop in thread A
void send_buffer()
{
scope_lock l(mutex);
if (!socket_available) return;
socket_available = false;
buffer = get_buffer_for_send(); // The size is about 50KB
boost::asio::async_write(
socket, buffer,
boost::bind(handle_write_request, boost::asio::placeholders::error)
);
}
// will be called in thread B which runs io_service::run
void handle_write_request(const boost::system::error_code& error_code)
{
scope_lock l(mutex);
socket_available = true;
free_buffer(buffer);
}
ハンドラーが呼び出された後に async_write を 1 回だけ呼び出すため、async_write を正しく使用していると思います ( http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_write/overload1.html)。ただし、データは送信中にインターリーブされているように見えます。
そのようなことを行う一般的な方法は、async_write をハンドラーに入れて、両方が 1 つのスレッドで呼び出されるようにすることです。そして、私がこれを行っているとき、データの破損は二度と起こりません. したがって、上記のコードが期待どおりに機能しない理由を知りたいと思っています。
お時間とアドバイスをありがとう。ところで、win 7 でブースト 1.54.0 を使用しています。