2017-06-22 13 views
1

同じソケットオブジェクトのメソッドを同時に呼び出すと、未定義の動作が発生することがわかります。前の呼び出しが完了する前にboost ASIO async_receive()をもう一度呼び出す

しかし、非同期操作を呼び出して、最初の補完ハンドラが呼び出される前にもう一度(非同期に)呼び出すのはどうでしょうか?

boost::asio::ip::udp::socket socket; 

// make socket join a multicast group, for instance 

socket.async_receive(boost::asio::null_buffers() , & handler1); 

// assume handler1() is not called between this two lines 

socket.async_receive(boost::asio::null_buffers() , & handler2); 

セイ、(もしあれば)次の予想される動作は何ですか?

これは誰かがやってはいけないことですが、そのような問題が解決された特定の場所をドキュメントで見つけることができませんでした。

答えて

2

あなたはそうです、それは非同期I/Oで大きなノーノです。 async_receiveを2回呼び出すことは実際にはほとんど意味がありませんが、送信中にこの種の状況を避けるためには、ある種のキュー、boost :: circular_bufferなどを使用することができます。これは完全にあなたのアプリケーションに依存します。

私は、ブースの文書では、読者が既に非同期ソケットの使用に精通していると仮定しているため、問題は解決されていないと思います。