交接需要双方参与

异步邮箱可以先保留消息,再由接收者处理;会合式通信则让双方在规定位置配合完成交接,等待由通信关系的一部分来表达,而不是额外猜测另一个活动是否已经准备好。

Go的无缓冲通道展示一种简单形式:发送和接收都准备好,通信才能成功。有缓冲通道允许在容量范围内先存下值,因而它的等待与同步条件不再相同。

参考:[1]

交接完成不总是业务完成

Go无缓冲通道的通信建立规定的同步关系,但发送完成不代表接收者随后要做的全部计算已经完成。若调用者还要等待处理结果,协议需要另外的结果传递或确认关系。

Ada任务入口的会合则可以执行对应accept语句,入口调用者在会合期间保持阻塞,并在适用的accept处理完成后返回。两个机制都包含同步,却不能把“一个值被接走”和“一段受调用处理已完成”的含义直接互换。

参考:[2] [3]

等待关系影响系统进展

会合能清楚表达依赖,也可能因缺少伙伴而一直等待。Go的select可在多个就绪通信中选择,没有可执行项也没有default时继续等待;nil通道不会成为可就绪的通信对象。

Ada入口调用还涉及排队、取消与任务结束等规则。把等待、超时及异常路径放进协议,才能说明伙伴没有出现时怎样收尾;会合只是同步构件,不会自动证明整个程序没有循环等待。

参考:[1] [3]