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

时间:2017-06-11 13:59:18

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

众所周知,我们可以在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);Boost asio non-blocking IO without callbacks

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

      

    SIGIO之后可能并不总是有连接等待          传递或选择(2),民意调查(2)或epoll(7)返回可读性          事件,因为连接可能已被删除          异步网络错误或accept()之前的另一个线程          调用。如果发生这种情况,那么呼叫将阻止等待          下一个连接到达。 要确保accept()永远不会阻止,          传递socket sockfd需要设置O_NONBLOCK 标志(参见          插座(7))。

    1. 接受器总是快速工作(只接受连接,创建一个新套接字,并将其传递给线程安全队列以在其他线程上处理它们 - 通过这些连接进行数据交换)。
    2. 因此,如果接受器永远不会阻塞且接受器总是快速工作那么一个CPU核心上的一个接受器是否可以处理所有新连接?

      如果可以的话,为什么我们需要很多感受器?

1 个答案:

答案 0 :(得分:1)

接受者绑定到特定端点。

在协议选择方面还有哪些不同。

因此,您可以在多个协议上为多个端点提供多个接受器。

你看起来似乎是,你可以在一个io_service上运行它们,并且不需要在多个线程上运行它。