2010-03-09 25 views
9

Tengo una lista de elementos que debo actualizar en diferentes intervalos. La lista puede llegar a tener miles de elementos de largo. Cada elemento podría tener un intervalo diferente. Si creo un temporizador por artículo, ¿voy a saturar el sistema con hilos? Estaba pensando que sería mejor crear un temporizador igual al intervalo más pequeño en el conjunto de elementos, y luego en cada actualización incrementar un contador, y luego verificar si el contador ahora es igual a cualquier otro intervalo. Esto debería funcionar siempre que el intervalo más pequeño sea un múltiplo de todos los demás intervalos. ¿Alguna sugerencia?Does boost :: asio :: deadline_timer utiliza un hilo para cada temporizador?

Respuesta

12

Boost no utiliza una secuencia por temporizador, mantiene una cola de temporizador. Cada temporizador se crea con el objeto boost::asio::io_service que hace el trabajo real.

Este objeto puede enviar su trabajo en uno o más hilos, when you run boost::asio::io_service::run() explicitly from multiple threads, pero no hay correspondencia uno-a-uno entre los temporizadores y los hilos, y Asio no creará hilos detrás de su espalda.

+0

Ok eso está bien, pero dices que enviará su trabajo en "uno o más" hilos. De forma predeterminada, si creo mil temporizadores vinculados a un io_service y ejecuto la llamada en el io_service de un hilo, todos esos temporizadores se realizarán en un nuevo hilo. Claramente, no se ejecutarán en el hilo de llamada cuando llame a timer :: async_wait, ¿verdad? Además, a pesar de esta capacidad, ¿mi diseño como se indica parece preferible a la creación de muchos temporizadores? ¿O, en esencia, estoy duplicando lo que hace el cronómetro? – Rhubarb

+6

(1) Sí, si ejecuta el servicio IO desde el subproceso A, todos los controladores de temporizador se ejecutarán en el subproceso A. (2) Se prefiere crear muchos temporizadores porque sería más fácil de mantener y menos propenso a errores que el cálculo manual más corto intervalo para un temporizador (tendrías elementos de trabajo y temporizadores de relación 1 a 1 b/n). –

+2

PS Y sí, estaría duplicando el trabajo que Asio ya hace por usted (siguiendo el primer temporizador que expira). –

1

Recent versions de Asio, Boost 1.43 y posterior, utilice la API timerfd_create(2) en Linux para deadline_timer s.

Se ha cambiado para usar timerfd para despachar temporizadores en Linux, cuando está disponible.

Cuestiones relacionadas