De acuerdo con la documentación sobre aio_read/write, hay básicamente 2 formas en que la biblioteca AIO puede informar a su aplicación que se ha completado una operación de E/S de archivo asíncrono. Ya sea 1) puede usar una señal, 2) puede usar una función de devolución de llamadaBiblioteca POSIX AIO y controladores de devolución de llamada
Creo que las funciones de devolución de llamada son bastante preferibles a las señales, y probablemente sean mucho más fáciles de integrar en bibliotecas de subprocesos múltiples de alto nivel. Lamentablemente, la documentación para esta funcionalidad es un desastre, por decir lo menos. Algunas fuentes, como man page for the sigevent struct, indican que debe establecer el miembro de datos sigev_notify en la estructura sigevent en SIGEV_CALLBACK y luego proporcionar un controlador de funciones. Presumiblemente, el controlador se invoca en el mismo hilo. Otro documentation indica que debe establecer sigev_notify a SIGEV_THREAD, que invocará el controlador de devolución de llamada en un subproceso recién creado.
En cualquier caso, en mi sistema Linux (Ubuntu con un kernel 2.6.28) SIGEV_CALLBACK no parece estar definido en ninguna parte, pero SIGEV_THREAD funciona como se anuncia. Desafortunadamente, crear un nuevo hilo para invocar el controlador de devolución de llamada parece ser realmente ineficiente, especialmente si necesita invocar a muchos controladores. Sería mejor utilizar un conjunto de hilos existente, similar a la forma en que funcionan la mayoría de los demultiplexores de eventos de E/S de red. Algunas versiones de UNIX, como QNX, incluyen un indicador SIGEV_SIGNAL_THREAD, que le permite invocar manejadores usando un hilo específico especificado, pero esto no parece estar disponible en Linux, ni siquiera parece ser parte del POSIX estándar.
Entonces, ¿es posible usar la biblioteca AIX de POSIX de una manera que invoca manejadores de usuario en un hilo/subproceso de fondo preasignado, en lugar de crear/destruir un nuevo subproceso cada vez que se invoca un controlador?
el problema con las señales es que si usted es una biblioteca, está configurando los manejadores en el contexto de su usuario. Lo cual puede sorprender y molestar a algunos de los usuarios. –
De hecho, esto es muy malo.Las bibliotecas nunca deben tocar señales, excepto para enmascararlas temporalmente. –