同步读/写端口时避免递归?

时间:2013-11-13 14:43:24

标签: asynchronous io rebol rebol3

Rebol 3中的所有端口操作都是异步的。我可以找到进行同步通信的唯一方法是调用wait

但是在这种情况下调用wait的问题是它将检查所有开放端口的事件(即使它们不在传递给wait的端口块中)。然后他们调用响应事件处理程序,但可以在其中一个事件处理程序中完成读/写操作。这可能导致递归调用“等待”。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

如果只有异步事件并且我们需要同步回复,启动计时器或休眠超时,如果满足处理程序或所需目标则表示为true,否则为false并确保事件被取消/如果关键,重置为相同。

答案 1 :(得分:0)

为什么不创建一种“缓冲”功能来接收来自同步条目的所有消息并将它们作为FIFO(先进先出)处理?

这样,您可以保留端口的Assync特性并以同步模式处理它们。

答案 2 :(得分:0)

我认为存在2个设计问题(可能是手头的工具/解决方案所固有的)。

  1. Wait做得太多-it will check events for all open ports。在良好的环境中,应仅在需要的地方实施等待:每个设备,每个端口,每个套接字...在共享资源之间创建不必要的相互依赖关系不会很好地结束-特别是知道共享资源(即使没有相互依赖关系)会造成很多问题。

  2. 事件处理程序可能做得太多。事件处理程序应尽可能短,并且仅应处理事件。如果做得更多,则说明处理程序做得过多-特别是在涉及其他共享资源的情况下。在许多情况下,处理程序只是保存数据,否则将丢失这些数据;异步作业将完成更复杂的事情。

答案 3 :(得分:-1)

你可以使用锁。 Cummunication1可以设置一些全局锁定状态,即使用变量(确保它是线程安全的)。 locked = true。然后Communication2可以等到它解锁。

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()