c++ - ¿Por qué necesitamos usar boost:: asio:: io_service:: work?
boost-asio (1)
Cuando se llama al método io_service :: run sin un objeto de trabajo, regresará de inmediato. Normalmente, ese no es el comportamiento que la mayoría de los desarrolladores están buscando. Por supuesto, hay algunas excepciones, pero la mayoría de los desarrolladores buscan especificar un subproceso para manejar todo el procesamiento asíncrono y no quieren que ese subproceso se cierre hasta que se le indique que lo haga. Eso es lo que hace su ejemplo de código.
El método io_service :: run se especifica como un puntero a función o delegado en los métodos create_thread. Por lo tanto, cuando el subproceso se crea desde el método create_thread, llamará al método io_service :: run y pasará el objeto io_service como un argumento. Normalmente, un objeto io_service se puede utilizar con varios objetos de socket.
El método de detención generalmente se llama cuando se apaga la aplicación o cuando ya no se requiere la comunicación entre todos los clientes / servidores y no se anticipa que será necesario iniciar ninguna conexión nueva.
Hay un ejemplo del uso de boost :: asio.
- ¿Por qué este ejemplo usa el impulso :: asio :: io_service :: funciona?
- ¿Y por qué es
srv.run ();
¿No se llama para realizar tareas en los hilos?
int main()
{
boost::asio::io_service srv;
boost::asio::io_service::work work(srv);
boost::thread_group thr_grp;
thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv));
thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv));
srv.post(boost::bind(f1, 123));
srv.post(boost::bind(f1, 321));
//sync
srv.post(boost::bind(f2, 456));
srv.post(boost::bind(f2, 654));
//sync
srv.stop();
thr_grp.join();
}
Actualización: ¿Cuál es la diferencia entre la encuesta y la ejecución, cuando io_service se usa sin io_service :: work?
int main()
{
boost::asio::io_service srv;
//boost::asio::io_service::work work(srv);
std::vector<boost::thread> thr_grp;
srv.post(boost::bind(f1, 123));
srv.post(boost::bind(f1, 321));
//sync
srv.post(boost::bind(f2, 456));
srv.post(boost::bind(f2, 654));
//sync
// What is the difference between the poll and run, when io_service without work?
thr_grp.emplace_back(boost::bind(&boost::asio::io_service::poll, &srv));// poll or run?
thr_grp.emplace_back(boost::bind(&boost::asio::io_service::run, &srv));// poll or run?
srv.stop();
for(auto &i : thr_grp) i.join();
int b;
std::cin >> b;
return 0;
}