根据aio_read/write文档,AIO库通知应用程序异步文件I/O操作已完成的基本方法有两种:1)使用信号;2)使用回调函数。我认为回调函数比信号更可取,并且可能更容易集成到更高级别的多线程库中。不幸的是,这个功能的文档非常混乱。一些来源(例如sigevent结构的man页面)表明,您需要将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库,以便在预先分配的后台线程/线程池中调用用户处理程序,而不是每次调用处理程序时创建/销毁新线程?
在我的Linux系统上(带有2.6.28内核的Ubuntu),无论如何,似乎没有定义SIGEV_CALLBACK,但是SIGEV_THREAD按照广告运作。不幸的是,为了调用回调处理程序而创建一个新线程似乎非常低效,特别是如果您需要调用许多处理程序。最好使用现有的线程池,类似于大多数网络I/O事件多路复用器的工作方式。某些版本的UNIX(例如QNX)包括一个SIGEV_SIGNAL_THREAD标志,允许您使用指定的现有线程调用处理程序,但这似乎在Linux上不可用,甚至似乎不是POSIX标准的一部分。
那么,是否可能以一种方式使用POSIX AIO库,以便在预先分配的后台线程/线程池中调用用户处理程序,而不是每次调用处理程序时创建/销毁新线程?