在前一个完成之前再次调用 boost ASIO async_receive()
Calling boost ASIO async_receive() again before a previous one has completed
我知道并发调用同一个套接字对象的方法会导致未定义的行为。
但是调用异步操作并在调用第一个操作的完成处理程序之前再次调用它(非并发)呢?
请说,以下(如果有)的预期行为是什么:
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 );
?
这似乎是某些人不应该做的事情,但我在文档中找不到解决此类问题的任何具体位置。
你说得对,这是异步的一大禁忌 i/o。调用 async_receive 两次实际上没有什么意义,但要在发送时避免这种情况可能意味着使用某种队列、boost::circular_buffer 等。这完全取决于您的应用程序。
我认为问题没有得到解决,因为 boost 文档假定 reader 已经熟悉使用异步套接字。
我知道并发调用同一个套接字对象的方法会导致未定义的行为。
但是调用异步操作并在调用第一个操作的完成处理程序之前再次调用它(非并发)呢?
请说,以下(如果有)的预期行为是什么:
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 );
?
这似乎是某些人不应该做的事情,但我在文档中找不到解决此类问题的任何具体位置。
你说得对,这是异步的一大禁忌 i/o。调用 async_receive 两次实际上没有什么意义,但要在发送时避免这种情况可能意味着使用某种队列、boost::circular_buffer 等。这完全取决于您的应用程序。
我认为问题没有得到解决,因为 boost 文档假定 reader 已经熟悉使用异步套接字。