我试图改变一个即发即热的UDP发送函数从同步到异步的实现。为异步发送缓冲区保留内存(升压asio套接字)
目前简易的同步功能看起来是这样的:
ssize_t UDPTransport::send_to(const char * buffer, size_t bufferSize) {
return mPSocket->send_to(boost::asio::buffer(buffer, bufferSize), mOutputEndpoint);
}
我有一个thread_group
设置和io_service::run()
设置为使用它。但是,问题在于,我无法保证在此通话完成后buffer
将存在。我需要存储缓冲区的内容,然后知道它何时可用,以便以后可以重新使用它或删除它。以下内容很简单,但如果我发起两个send_to
通话,那么我不能保证handle_send
将以相同的顺序被呼叫,而我可能还需要pop
!
ssize_t UDPTransport::send_to(const char * buffer, size_t bufferSize) {
boost::asio::mutable_buffer b1 = boost::asio::buffer(buffer,bufferSize);
mMutex.lock();
mQueue.push(b1);
mPSocket->async_send_to(mQueue.back(), mOutputEndpoint,
boost::bind(&UDPTransport::handle_send, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
mMutex.unlock();
return bufferSize;
}
void UDPTransport::handle_send(const boost::system::error_code& error,
std::size_t bytes_transferred)
{
mMutex.lock();
mQueue.pop();
mMutex.unlock();
}
什么是存储异步缓冲的好方法,那么它清理干净,一旦它不再需要?
Reading online更简单的方式可能会在下面,但我不知道我是否信任它。为什么共享指针决定在调用处理程序之后才解除分配?
ssize_t UDPTransport::send_to(const char * buffer, size_t bufferSize)
{
auto buf = std::make_shared<std::string>(buffer, bufferSize);
mPSocket->async_send_to(boost::asio::buffer(*buf), mOutputEndpoint,
boost::bind(&UDPTransport::handle_send, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
return bufferSize;
}
您链接的shared_ptr解决方案可能是正确的,因为它在lambda中通过值捕获shared_ptr。所以一旦处理程序被调用,它应该释放自己。然而,你的代码与shared_ptr不这样做。 –