使用相同的 Boost.Asio io_service 作为线程池同步接受 tcp 连接
Using the same Boost.Asio io_service for accepting tcp connections synchronously and as a thread pool
以下使用 io_service 接受 tcp 连接并作为线程池为连接的客户端提供服务的方法是否有效,或者是否有一些注意事项?
io_service svc;
io_service::work work(svc);
// define the three threads in the io_service thread pool
thread t1( [&svc]() { svc.run(); } );
thread t2( [&svc]() { svc.run(); } );
thread t3( [&svc]() { svc.run(); } );
endpoint ep(ip::tcp::v4(), port);
acceptor acceptor(svc, ep);
while (true) {
shared_ptr<socket> sock(new socket(svc));
acceptor.accept(*sock);
// post a task to the io_service
svc.post( [sock]() { /* do stuff on sock here */ });
}
...
完全没问题。
一个警告是,如果您 post 任务阻塞了非常长的时间。
异步 IO 操作都意味着 非常短 的执行时间。如果您用非 IO 任务阻塞服务线程,IO 任务将获得高(呃)延迟
以下使用 io_service 接受 tcp 连接并作为线程池为连接的客户端提供服务的方法是否有效,或者是否有一些注意事项?
io_service svc;
io_service::work work(svc);
// define the three threads in the io_service thread pool
thread t1( [&svc]() { svc.run(); } );
thread t2( [&svc]() { svc.run(); } );
thread t3( [&svc]() { svc.run(); } );
endpoint ep(ip::tcp::v4(), port);
acceptor acceptor(svc, ep);
while (true) {
shared_ptr<socket> sock(new socket(svc));
acceptor.accept(*sock);
// post a task to the io_service
svc.post( [sock]() { /* do stuff on sock here */ });
}
...
完全没问题。
一个警告是,如果您 post 任务阻塞了非常长的时间。
异步 IO 操作都意味着 非常短 的执行时间。如果您用非 IO 任务阻塞服务线程,IO 任务将获得高(呃)延迟