众所周知,我们可以在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);
: Boost asio non-blocking IO without callbacks
http://man7.org/linux/man-pages/man2/accept.2.html
SIGIO之后可能并不总是有连接等待 传递或选择(2),民意调查(2)或epoll(7)返回可读性 事件,因为连接可能已被删除 异步网络错误或accept()之前的另一个线程 调用。如果发生这种情况,那么呼叫将阻止等待 下一个连接到达。 要确保accept()永远不会阻止, 传递socket sockfd需要设置O_NONBLOCK 标志(参见 插座(7))。
因此,如果接受器永远不会阻塞且接受器总是快速工作那么一个CPU核心上的一个接受器是否可以处理所有新连接?
如果可以的话,为什么我们需要很多感受器?
答案 0 :(得分:1)
接受者绑定到特定端点。
在协议选择方面还有哪些不同。
因此,您可以在多个协议上为多个端点提供多个接受器。
你看起来似乎是,你可以在一个io_service
上运行它们,并且不需要在多个线程上运行它。