2

boost::asio を使用して udp ブロードキャスト サーバーを作成しています。Udp パケットは 1 つのソース側から受信され、複数の宛先にブロードキャストされます。このようなことを単一のスレッドで行うのは安全ですか?

boost::asio::ip::udp::socket s;
MyHandler handler; // do nothing handler
MyBuffer buffer; //  buffer is allocated on heap and managed by smart ptr
...

s.async_send_to(buffer, destination1, handler);
s.async_send_to(buffer, destination2, handler);
s.async_send_to(buffer, destination3, handler);

または、代わりに send_to のブロックを使用する必要がありますか? または、最初の async_send_to の完了ハンドラで 2 番目の async_send_to を呼び出すなど、それらを連鎖させる必要がありますか?

4

1 に答える 1

0

ドキュメントには次のように書かれています:

buffers オブジェクトは必要に応じてコピーできますが、基になるメモリ ブロックの所有権は呼び出し元によって保持されます。呼び出し元は、ハンドラーが呼び出されるまでそれらが有効であることを保証する必要があります。

バッファがスタックに割り当てられている (つまり、async_send が呼び出された同じブロックで定義されている) 場合、これはおそらく壊れています。async_send の呼び出しはブロックされず、このコード スニペットから戻るとすぐにメモリの割り当てが解除されるためです。'buffer' をクラス プロパティにして、必要な限り有効なままにしておくことができます。しかし、バッファーがヒープ上にある場合は問題なく、コードはそのまま機能します。

于 2012-11-08T22:38:25.780 に答える