TCP サーバーがあり、同時に多くのソケットにデータを送信する必要があります。そのためにブーストを使用しています。
複数のソケットにデータを送信する必要がある場合は、送信したいデータを使用して各ソケットを呼び出しboost::asio::async_write
ます。
boost::asio::async_write
あるソケットで呼び出してコールバックを待つことに違いと利点があるかどうか疑問に思っていました(そして、次のソケットで呼び出します...)
TCP サーバーがあり、同時に多くのソケットにデータを送信する必要があります。そのためにブーストを使用しています。
複数のソケットにデータを送信する必要がある場合は、送信したいデータを使用して各ソケットを呼び出しboost::asio::async_write
ます。
boost::asio::async_write
あるソケットで呼び出してコールバックを待つことに違いと利点があるかどうか疑問に思っていました(そして、次のソケットで呼び出します...)
async_write からのコールバックを待っても、(本質的にランダムな) 遅延が発生するだけで、何のメリットもありません。
唯一の例外は、基になるプロトコルに輻輳制御がない場合です。つまり、UDP を使用する場合、おそらくアプリケーションにある種の輻輳制御を実装する必要がありますが、それでも async_write コールバックを待つのは適切ではありません。アイデア (これは、データがオペレーティング システムに渡されたことを示しているだけです)。
しかし、TCP を使用しているため、コールバックを待っても何のメリットもありません。
WriteHandlerは、async_write
操作でエラーが発生した場合、またはすべてのデータがソケットに書き込まれた場合に実行可能です。したがって、異なるソケット間で複数の非同期書き込みを発行すると、速度が向上する可能性があります。ただし、バッファを適切に管理するには、さらに注意が必要です。
shared_ptr
、単純にshared_ptr
を各WriteHandlerにバインドします。pending_writes_
変数に格納し、各WriteHandlerをデクリメントすることを検討してくださいpending_writes_
。pending_writes_
ゼロになると、バッファは他の操作に再利用できます。への変更をシリアル化するにpending_writes_
は、各WriteHandlersをstrand
.私はネットワークの専門家ではないので、ここで何か問題があれば遠慮なくコメントしてください。
非同期:
非同期呼び出しを行う利点は、呼び出しの直後に制御が返されることです。そのため、呼び出しのステータスを確認するのを待っている間に、他のより生産的なことを行ったり、CPU を解放したりできます。これにより、非同期システムが効率的になります。
短所は、非同期呼び出しを行うのが難しいことです。呼び出しの結果を通信するためのロックやメカニズムは必要ありません。これは、実装が非常に難しい場合があります。
同期:
同期呼び出しを行う利点は、実装と理解が容易になることです。
欠点は、結果が得られるまでブロックされることです。これにより、システムが非常に遅くなり、デッドロックが発生する可能性があります。