根据有关 aio_read/write 的文档,AIO 库可以通过两种方式通知您的应用程序异步文件 I/O 操作已完成。1)您可以使用信号,2)您可以使用回调函数
我认为回调函数比信号更可取,并且可能更容易集成到更高级别的多线程库中。不幸的是,这个功能的文档至少可以说是一团糟。一些来源,例如sigevent struct 的手册页,表明您需要将 sigevent 结构中的 sigev_notify 数据成员设置为 SIGEV_CALLBACK,然后提供函数处理程序。据推测,处理程序是在同一个线程中调用的。其他文档表明您需要将 sigev_notify 设置为 SIGEV_THREAD,这将在新创建的线程中调用回调处理程序。
无论如何,在我的 Linux 系统(带有 2.6.28 内核的 Ubuntu)上似乎没有在任何地方定义 SIGEV_CALLBACK,但 SIGEV_THREAD 像宣传的那样工作。不幸的是,创建一个新线程来调用回调处理程序似乎效率很低,尤其是当您需要调用许多处理程序时。最好使用现有的线程池,类似于大多数网络 I/O 事件多路分解器的工作方式。某些版本的 UNIX,例如 QNX,包含一个 SIGEV_SIGNAL_THREAD 标志,它允许您使用指定的现有线程调用处理程序,但这似乎在 Linux 上不可用,它似乎甚至不是 POSIX 的一部分标准。
那么,是否可以以在预分配的后台线程/线程池中调用用户处理程序的方式使用 POSIX AIO 库,而不是在每次调用处理程序时创建/销毁新线程?