linux – POSIX AIO库和回调处理程序

根据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更简单,更便携,以我喜欢的方式调度完成回调.

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...