为什么我们需要在Boost.ASIO中有很多接受者?

Why would we need many acceptors in the Boost.ASIO?

本文关键字:接受者 ASIO 我们 Boost 为什么      更新时间:2023-10-16

众所周知,我们可以在boost::asio中使用多个受体。

boost::asio::io_service io_service_acceptors;
std::vector<boost::thread> thr_grp_acceptors;
unsigned int thread_num_acceptors = 2;
for(size_t i = 0; i < thread_num_acceptors; ++i) {
thr_grp_acceptors.emplace_back(
boost::bind(&boost::asio::io_service::run, &io_service_acceptors));

但是,io_service_acceptors做超过1有什么意义吗?


  1. Boost.ASIO使用最佳的非阻塞解复用机制(epoll,IOCP,...)。

  2. 此外,即使在epoll之后和之前会发生网络错误accept也不会阻止接受,因为我们可以设置non_blocking(true);: 在没有回调的情况下提升 asio 非阻塞 IO

http://man7.org/linux/man-pages/man2/accept.2.html

在SIGIO之后可能并不总是有连接等待 已交付或选择(2)、投票(2)或epoll(7)返回可读性 事件,因为连接可能已被 异步网络错误或 accept() 之前的另一个线程 叫。 如果发生这种情况,则呼叫将阻止等待 下一个连接到达。为了确保 accept() 永远不会阻塞, 传递的套接字 sockfd 需要设置O_NONBLOCK标志(请参阅 套接字(7))。

    接受
  1. 器总是快速工作(只接受连接,创建一个新的套接字,并将其传递给线程安全队列以在其他线程上处理它们 - 用于通过这些连接进行数据交换)。

因此,如果接受器从不阻塞并且接受器总是快速工作,那么一个 CPU 内核上的一个接受器可以处理所有新连接吗?

如果他们可以,那我们为什么需要很多接受者呢?

接受器绑定到特定端点。

更重要的是,它在协议选择方面有所不同。

因此,您可以在多个协议上的多个端点上有多个接受器。

您似乎所追求的是,事实上,您可以在单个io_service上运行它们,并且无需在多个线程上运行它。