【问题标题】:Why would we need many acceptors in the Boost.ASIO?为什么我们在 Boost.ASIO 中需要很多接受器?
【发布时间】:2017-06-11 13:59:17
【问题描述】:

众所周知,我们可以在 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之前会出现网络错误,那么accept不会被阻止,因为我们可以设置non_blocking(true);:Boost asio non-blocking IO without callbacks

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

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

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

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

如果可以,那我们为什么需要很多受体?

【问题讨论】:

  • 多个网卡怎么样?
  • @πάντα ῥεῖ 你的意思是我可以使用多个带有 ba::ip::tcp::endpoint local_endpoint( ip_nic_1 )ba::ip::tcp::endpoint local_endpoint( ip_nic_2 )... 的接受器而不是一个接受器 ba::ip::tcp::endpoint local_endpoint( ba::ip::tcp::v4() ) (INADDR_ANY / in6addr_any) 来提高性能?

标签: c++ multithreading sockets boost boost-asio


【解决方案1】:

接受器绑定到特定端点。

此外,它在协议选择方面也有所不同。

因此,您可以为多个协议上的多个端点设置多个接受器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2011-04-01
    • 1970-01-01
    • 2018-04-17
    • 2016-11-18
    • 2014-06-18
    • 2017-02-26
    相关资源
    最近更新 更多