tag sobre responder raras que preguntas pregunta para nadie lista las incomodas divertidas cosas c++ boost asynchronous network-programming boost-asio

c++ - sobre - tag de preguntas random



¿Son buenos los io_services de ASIO una buena cosa? (3)

Esta discusión puede ser esclarecedor:

http://thread.gmane.org/gmane.comp.lib.boost.asio.user/1300

No tengo el código aquí mismo, pero ¿por qué usaría múltiples io_services? Pensé que usaba un io_service y se ejecutaban varios subprocesos en ese io_service.

IIUC, cada io_service posee una cola selecta / epoll / lo que sea, por lo que tener múltiples io_servicios es similar a tener múltiples bucles independientes de selección / epoll. En algunas situaciones, por ejemplo. un gran número de sockets y varias CPU, esto podría ayudar.

Algo sobre lo que estoy menos seguro es con múltiples subprocesos que ejecutan io_service :: run (con el mismo io_service). Creo que esto solo significa que los manejadores se ejecutan simultáneamente, mientras que los select / epoll / etc. el bucle es ''compartido''. Creo que esto es mejor para cuando sus manejadores son operaciones de larga duración.

Comencé a usar Boost.ASIO para una programación de red simple, mi comprensión de la biblioteca no es muy buena, así que por favor, tengan paciencia conmigo y con mi pregunta de novato.

En este momento en mi proyecto solo tengo 1 objeto io_service . Que usar para todas las operaciones de E / S asíncronas etc.

Mi entendimiento es que uno puede crear varios subprocesos y pasar el método de ejecución de una instancia de io_service al subproceso para proporcionar más subprocesos al io_service .

Mi pregunta: ¿Es un buen diseño tener múltiples objetos io_service ? digamos, por ejemplo, tener 2 instancias distintas de io_service , cada una con 2 subprocesos asociados, ¿de alguna manera se conocen entre sí (y, por lo tanto, cooperan con cada una), o si no, se afectarían negativamente entre sí?

Mi intención es tener 1 io_service para E / S basada en socket y otra para I / O basada en serie (tty).


IIRC, durante la charla de Michael Caisse sobre Boostcon ASIO (que vale la pena ver de todos modos), creo que esta pregunta la pregunta explícitamente un miembro de la audiencia y se acepta como una posible solución. Tomo de eso que no es incorrecto per se , y puede usarse de esa manera de acuerdo con su diseño.


Utilizamos múltiples io_service''s porque algunos de los componentes de nuestra aplicación necesitan ejecutar todos sus subprocesos de trabajo en determinadas prioridades fijas, diferentes para cada componente. Por lo tanto, cada componente recibe su propio io_service, y cada componente tiene su propio grupo de subprocesos que ejecutan run() .

Otros diseños que podría pensar serían si se requiere un número diferente de subprocesos en el grupo para cada IO, o, más relevante para su caso, es si el grupo no se puede compartir porque, por ejemplo, si el IO de su red puede eliminar Cada hilo y deja en espera tu serial IO.