【发布时间】: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 有什么意义吗?
Boost.ASIO 使用最佳的非阻塞解复用机制(epoll、IOCP、...)。
同样即使在
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))。
- 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