为什么我们需要在Boost.ASIO中有很多接受者?
Why would we need many acceptors in the 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有什么意义吗?
Boost.ASIO使用最佳的非阻塞解复用机制(epoll,IOCP,...)。
此外,即使在
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))。
- 接受
- 器总是快速工作(只接受连接,创建一个新的套接字,并将其传递给线程安全队列以在其他线程上处理它们 - 用于通过这些连接进行数据交换)。
因此,如果接受器从不阻塞并且接受器总是快速工作,那么一个 CPU 内核上的一个接受器可以处理所有新连接吗?
如果他们可以,那我们为什么需要很多接受者呢?
接受器绑定到特定端点。
更重要的是,它在协议选择方面有所不同。
因此,您可以在多个协议上的多个端点上有多个接受器。
您似乎所追求的是,事实上,您可以在单个io_service
上运行它们,并且无需在多个线程上运行它。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 缓慢提升ASIO
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- C++ Boost::asio串行通信与Arduino无法写入
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 提升 ASIO - io_service 不要等待连接到线程
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 为什么我们需要在Boost.ASIO中有很多接受者?
- 提升 Asio tcp::接受者访问冲突异常