これが私のシナリオです。単一のスレッドからソケットに対して複数の非同期書き込みが要求されます。同じスレッドが。を呼び出しますio_service::run
。したがって、すべての完了ハンドラーは、対応する非同期書き込みが開始されたのと同じ順序で実行されると想定しています。最後の完了ハンドラーでソケットをシャットダウンして閉じても大丈夫ですか?
編集:私はTCPプロトコルを使用しています。
これが私のシナリオです。単一のスレッドからソケットに対して複数の非同期書き込みが要求されます。同じスレッドが。を呼び出しますio_service::run
。したがって、すべての完了ハンドラーは、対応する非同期書き込みが開始されたのと同じ順序で実行されると想定しています。最後の完了ハンドラーでソケットをシャットダウンして閉じても大丈夫ですか?
編集:私はTCPプロトコルを使用しています。
async_write()
最初のの完了ハンドラー内から呼び出す必要がありasync_write()
ます。擬似コードは以下のとおりです
boost::asio::io_service ios;
boost::asio::ip::tcp::socket socket( ios );
void
handler2()
{
socket.shutdown( boost::asio::ip::tcp::socket::shutdown_both );
socket.close();
}
void
handler1()
{
async_write( socket, boost::bind(&handler2) );
}
int
main()
{
async_write( socket, boost::bind(&handler1) );
}
ドキュメントには、単一の未処理の操作が実行中である可能性があることが明示的に記載されていることに注意してください。
この操作は、ストリームの関数への0回以上の呼び出しに関して実装さ
async_write_some
れ、合成操作と呼ばれます。プログラムは、この操作が完了するまで、ストリームが他の書き込み操作(async_write
ストリームのasync_write_some
関数、または書き込みを実行する他の合成操作など)を実行しないようにする必要があります。
そのため、1つのソケットで複数の操作を呼び出すことasync_write()
はお勧めできません。または、スキャッター操作を使用して、両方のバッファーを1つに送信しますasync_write()
。
TCP ソケットがあると仮定します (UDP プロトコルはコネクションレスであるため)。
次のようなことをすると:
start_async_write(first)
start_async_write(second) -> close socket on complete
io_service.run()
すべてがOKになり、書き込みがシリアル化され、ソケットのメソッドが完了ハンドラーによって呼び出されたrun()
後にメソッドが返されます。close