Boost asio特别允许多个线程在io_service上调用run()方法.这似乎是创建多线程UDP服务器的好方法.然而,我遇到了一个障碍,我正在努力寻找答案.
查看典型的async_receive_from调用:
m_socket->async_receive_from(
boost::asio::buffer(m_recv_buffer),
m_remote_endpoint,
boost::bind(
&udp_server::handle_receive,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
Run Code Online (Sandbox Code Playgroud)
远程端点和消息缓冲区不会传递给处理程序,但是处于更高的作用域级别(在我的示例中为成员变量).UDP消息到达时处理UDP消息的代码如下所示:
void dns_server::handle_receive(const boost::system::error_code &error, std::size_t size)
{
// process message
blah(m_recv_buffer, size);
// send something back
respond(m_remote_endpoint);
}
Run Code Online (Sandbox Code Playgroud)
如果有多个线程在运行,那么同步如何工作?在线程之间共享一个端点和接收缓冲区意味着在同时消息到达的情况下,asio在另一个线程中调用处理程序之前等待处理程序在单个线程内完成.这似乎否定了允许多个线程首先调用run的观点.
如果我想获得并发服务的请求,看起来我需要将工作包和端点的副本一起交给一个单独的线程,允许处理程序方法立即返回,以便asio可以继续并通过另一个与另一个调用run()的线程并行的消息.
这看起来有点令人讨厌.我在这里错过了什么?