gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:12:31 25 4
gpt4 key购买 nike

众所周知,我们可以在 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也不会被阻止,因为我们可以设置非阻塞(真);:Boost asio non-blocking IO without callbacks

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

There may not always be a connection waiting after a SIGIO is delivered or select(2), poll(2), or epoll(7) return a readability event because the connection might have been removed by an asynchronous network error or another thread before accept() is called. If this happens, then the call will block waiting for the next connection to arrive. To ensure that accept() never blocks, the passed socket sockfd needs to have the O_NONBLOCK flag set (see socket(7)).

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

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

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

最佳答案

接受器绑定(bind)到特定端点。

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

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

您似乎想要的是,您确实可以在单个 io_service 上运行它们,并且不需要在多个线程上运行它。

关于c++ - 为什么我们在 Boost.ASIO 中需要很多接受器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44484689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com