2.3.6 活动消息进程
前文中讲到,GASNet能够使用内部线程或中断的方式运行AM处理程序。虽然我们重点关注客户端代码编写的正确性,但是大多数代码实现所缺乏的异步进程控制机制不能作为错误的典范。相反,典型的AM驱动的GASNet应用的进程依赖于客户端向GASNet发送的消息数目。尽管客户端能够保证AM初始化调用以轮询的方式处理进入的AM程序,但这远远不够。因此,有以下两种显式轮询方式:
gasnet_AMPoll函数对进入的AM(包括Request和Reply)进行检查,并在函数返回前执行其中的依赖最大数的函数实现部分。所以难以确保在函数返回时没有额外的AM等待时间。该函数通常在客户端自身的进程循环中执行,或在未知轮询时间的客户端操作前后使用。宏GASNET_BLOCKUNTIL用于阻塞操作直到判断条件为真。它将C表达式作为参数进行计算,且GASNet执行的代码在功能上等同于:
然而,GASNET_BLOCKUNTIL用于实现特定的控制机制而不是通用机制。需要注意的是,对于由于使用GASNET_BLOCKUNTIL的AM代码阻塞扩展API调用改变内存的行为,使用GASNET_BLOCKUNTIL是唯一能够阻塞中间等待时间的方法,且可以无限阻塞。