异步完成令牌( Asynchronous Completion Token,ACT)常用来在异步IO中传递用户自定义参数。例如,在多路IO复用/解复用的时候,我们可以在ACT中存放异步调用发起者的信息,在操作完成时便于定位最初的调用者。
为传递异步调用的环境信息,Windows平台提供了 I/O完成端口,POSIX提供了aiocb(Asynchronous I/O control block)。但aiocb中并没有专门的字段来存放用户自定义信息。因此,在早期的ACE框架中,只有Windows平台支持ACT。下面代码摘自Linux 2.6.18:
可以发现,aiocb的最后32字节未被系统使用,因此我们可以利用这些字节存放用户自定义信息。通常我们最多传递一个地址指针,32字节足够了。 新版ACE框架中的ACE_POSIX_Asynch_Result正是利用了这一特性,从aiocb派生并扩展其特性。
上述代码中的act_字段实现了用aiocb存放ACT信息。调用aio*系列函数时,只要传递ACE_POSIX_Asynch_Result对象即可。