在Rebol的3端口的所有操作都是异步的。我能找到做同步通信的唯一方法是调用wait
。
但在这种情况下调用wait的问题是,它会检查所有开放端口事件(即使他们不是在传递给等待端口块)。然后,他们称自己的响应事件处理程序,但读/写可以在这些事件处理程序中的一个来完成。这可能会导致递归调用“等待”。
如何解决这个问题?
为什么难道你不创造一种“缓冲”功能,从assyncronous项收到的所有消息和处理它们的FIFO(先入先出)?
这样,你可以让你的端口Assync特点和同步方式处理它们。
在情况下,只有异步事件,我们都需要在同步回复,启动超时定时器或睡眠,如果处理程序或需要的目标是满足,那么说真,否则为假,并确保该事件被取消/重设同样,如果关键。
我认为有2个设计问题(也许内在手头的工具/解决方案)。
Wait
做得太多 - it will check events for all open ports
。在一个良好的环境,等待应该只在需要的地方进行:每台设备,每个端口,每个插槽...创建共享的资源不能结束之间不必要的依存关系以及 - 尤其是知道的共享资源(即使没有相互依存关系)可以创造很多问题。你可以只用一个锁。 Cummunication1可以设置一些全局锁定状态,即用一个变量(可以肯定的,它是线程安全的)。 locked = true
。然后,通讯2可以等到它的解锁。
loop do
sleep 10ms
break if not locked
end
locked = true
handle_communication()