2010-02-11 14 views
7

escenario actual se epoll_wait lo largo de un par de FDS y una cola de posibles mensajes entrantes, me gustaría que el bucle por debajo epoll_wait a ser ejecutado en caso de IO o el nuevo mensaje.
maneras que sé:epoll_wait con un evento no-IO, no hay señales de

  • Utilice un tiempo de espera mseg time y compruebe la primera cosa de la cola en el bucle
  • Uso del self-pipe trick del código de cola cuando los mensajes estén disponibles
  • Interrumpir la llamada al sistema con una señal estándar
  • uso epoll_pwait y refinar el punto anterior

Ninguno de los puntos anunciados por encima de satisfacer mi enoug h y me preguntaba si hay otros métodos que no he encontrado.
Las razones son:

  • Las señales son algo a evitar en el código multiproceso y no son muy fiables
  • Tiempo de espera de un solo extrae una parte del beneficio de la epoll, sólo se despierta con los eventos
  • Auto-pipe trick miradas el mejor enfoque por el momento, pero aún demasiado repetitivo

ideas?

Respuesta

17

Puede usar un eventfd que es efectivamente lo mismo que el truco de autopipa excepto que con menos descriptores de archivo y menos texto estándar (glibc tiene funciones de conveniencia eventfd_read/write por ejemplo).

+0

He usado eventfd con éxito cuando sólo se está a la espera de una epollfd, pero ¿qué pasa con múltiples subprocesos esperan la misma * * epollfd? ¿eventfd es útil en este caso también? ¿si es así, cómo? –

1

Se han enumerado los eventos que pueden despertar epoll, por lo que la pregunta realmente se convierte en: "¿Cómo puedo reducir el texto modelo para el truco de auto-pipe"

La respuesta a esa pregunta realmente depende de su código, el lenguaje y lo que está tratando de hacer. Supongo que tiene un hilo que procesa E/S y desea hacer otro trabajo en ese hilo mientras no hay E/S lista. En el código que gestiona el bucle epoll, puede tener un mango interno que está expuesto a otras partes del sistema como una función "despertar" o una función "enviar el trabajo".

Hay bibliotecas que hacen esto, por ejemplo boost.asio para C++. Sin embargo, no es difícil escribir su propio si sólo está dirigido epoll, y la cantidad de código repetitivo real debe ser mínimo una vez que tenga una clase/módulo/lo que sea que se ocupa del bucle epoll.

Cuestiones relacionadas