Dígame, por favor, aquí hay una cita de la sección de referencia 3 (" Ejecutar un ciclo de eventos ") del libro de Nick Mathewson sobre Libevent :
Por defecto, la función event_base_loop() ejecuta un event_base hasta que no haya más eventos registrados en él.
Honestamente, no puedo entender esta frase.
Lo que significa - "hasta que no haya más eventos registrados".
¿Cómo sabe un bucle que no hay más eventos nuevos? Puede haber un intervalo de tiempo entre eventos: 1 segundo, 1 hora ...
¿Cómo sabe Libevent que los eventos han terminado?
PD: Estoy tratando de comparar el trabajo de la función event_base_loop () con la función GetQueuedCompletionStatus () en Windows y no lo entiendo. Debido a que GetQueuedCompletionStatus funciona en un bucle infinito, ya sea que haya eventos o no, GetQueuedCompletionStatus espera un evento infinitamente nuevo y no se completa si no hay ninguno.
PD1:Tenía prisa y no terminé el capítulo sobre "Trabajar con un bucle de eventos".
Dice que puede redefinir el comportamiento de la función event_base_loop () pasándole un indicador en el segundo parámetro: EVLOOP_NO_EXIT_ON_EMPTY.
Esto significará que la función esperará nuevos eventos indefinidamente o hasta que quiera salir del bucle event_base_loop () manualmente a través de event_base_loopbreak / event_base_loopexit.
Tenga en cuenta que dice "no más eventos registrados ", en lugar de "no más eventos ". De forma predeterminada, el bucle de eventos se cerrará cuando la base de eventos se quede vacía, aunque podrían ocurrir más eventos más adelante. Esto se reafirma de manera diferente más adelante en el capítulo:
Por lo general, el ciclo se cerrará tan pronto como no tenga eventos pendientes o activos.
y en la documentación de la API para event_base_loop() :
De forma predeterminada, este bucle ejecutará la base de eventos hasta que no haya más eventos pendientes o activos, o hasta que algo llame a event_base_loopbreak() o event_base_loopexit().
Como se indica en la pregunta, EVLOOP_NO_EXIT_ON_EMPTY puede cambiar este comportamiento para que funcione más como una cola de eventos típica, esperando eventos (a menos que se haya configurado EVLOOP_NONBLOCK ) y enviándolos cuando llegan.
" Ejecutar un bucle de eventos " contiene pseudocódigo para event_base_loop() que también debería ayudar a aclarar el comportamiento.
En comparación, GetQueuedCompletionStatus esperará y operará en un solo paquete (nota: la espera probablemente no sea un bucle ocupado, sino que se basa en algunas otras tecnologías multitarea, como interrupciones y primitivos de sincronización de subprocesos; el método exacto es un detalle de implementación y no debería) t afectar el uso). Es más similar a event_base_loop() con las banderas EVLOOP_ONCE | EVLOOP_NO_EXIT_ON_EMPTY , aunque event_base_loop puede procesar varios eventos de la misma prioridad si llegan antes de que el primer evento se maneje por completo. Viniendo desde la otra dirección, si se pasa 0 para el argumento dwMilliseconds a GetQueuedCompletionStatus , se comporta como el comportamiento predeterminado de event_base_loop() , saliendo inmediatamente si no hay paquetes en la cola de finalización de E/S.