2.3.7 活动消息规则与约束
GASNet规范是了解相关细节最完整的参考资料,本节将介绍使用GASNet编写正确、可移植的AM代码时所必须遵循的主要规则。然而,并非所有应用实现都必须强制执行所有的规则,只是客户端必须遵循这些规则,否则一些实现将出现不正确的操作。
- 作为AM Request结果的处理程序执行,仅允许通过对AMReply函数的单一可选函数进行通信。
- 作为AM Reply结果的处理程序执行,不允许发生任何通信。
- 没有处理程序可以调用GASNet屏障函数、初始化AM Request或调用扩展API中的任意部分(包括那些禁止通信部分)。
- 处理程序可以在函数中临时阻塞以获得HSL,但必须在函数执行结束前释放获得的HSL。
- 处理程序可以不调用GASNET_BLOCKUNTIL。
- GASNet实现不必保证AM顺序执行且客户端代码必须在重新排序消息发生时处于死锁状态。
- 客户端代码必须以线程安全的方式进行编写(通过正确使用HSL的方式),即使是单线程客户端,GASNet也可以异步执行AM处理程序。
- 传递给GASNET_BLOCKUNTIL的表达式也得受上述规则约束,且需要考虑这些表达式有可能与AM处理程序并发执行的情况。