根据aio_read / write上的文档,AIO库基本上有两种方式可以通知您的应用程序异步文件I / O操作已完成.要么1)你可以使用信号,2)你可以使用回调函数
我认为回调函数比信号更受欢迎,并且可能更容易集成到更高级别的多线程库中.不幸的是,至少可以说这个功能的文档很乱.某些源(例如man page for the sigevent struct)表明您需要将sigevent结构中的sigev_notify数据成员设置为SIGEV_CALLBACK,然后提供函数处理程序.据推测,处理程序在同一个线程中调用.其他documentation表示您需要将sigev_notify设置为SIGEV_THREAD,它将在新创建的线程中调用回调处理程序.
在任何情况下,在我的Linux系统(带有2.6.28内核的Ubuntu)上,SIGEV_CALLBACK似乎没有在任何地方定义,但SIGEV_THREAD的工作方式与广告一样.不幸的是,创建一个新线程来调用回调处理程序似乎效率很低,特别是如果你需要调用许多处理程序.最好使用现有的线程池,类似于大多数网络I / O事件多路分解器的工作方式.某些版本的UNIX(如QNX)包含一个SIGEV_SIGNAL_THREAD标志,它允许您使用指定的现有线程调用处理程序,但这似乎在Linux上不可用,它似乎甚至不是POSIX的一部分标准.
那么,是否可以以在预先分配的后台线程/线程池中调用用户处理程序的方式使用POSIX AIO库,而不是每次调用处理程序时创建/销毁新线程?
解决方法
我通常发现通过在专用后台线程或线程中执行普通IO来模拟异步IO更简单,更便携,以我喜欢的方式调度完成回调.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。