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

问题描述 投票:103回答:4

在Rebol的3端口的所有操作都是异步的。我能找到做同步通信的唯一方法是调用wait

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

如何解决这个问题?

asynchronous io rebol rebol3
4个回答
1
投票

为什么难道你不创造一种“缓冲”功能,从assyncronous项收到的所有消息和处理它们的FIFO(先入先出)?

这样,你可以让你的端口Assync特点和同步方式处理它们。


0
投票

在情况下,只有异步事件,我们都需要在同步回复,启动超时定时器或睡眠,如果处理程序或需要的目标是满足,那么说真,否则为假,并确保该事件被取消/重设同样,如果关键。


0
投票

我认为有2个设计问题(也许内在手头的工具/解决方案)。

  1. Wait做得太多 - it will check events for all open ports。在一个良好的环境,等待应该只在需要的地方进行:每台设备,每个端口,每个插槽...创建共享的资源不能结束之间不必要的依存关系以及 - 尤其是知道的共享资源(即使没有相互依存关系)可以创造很多问题。
  2. 事件处理程序可以做太多。事件处理程序应尽可能短,并且它应该只处理该事件。如果做多,那么处理程序做得太多 - 尤其是如果涉及到其他共享资源。在许多情况下,处理器只是保存将另行丢失的数据;和异步工作会做更复杂的事情。

-1
投票

你可以只用一个锁。 Cummunication1可以设置一些全局锁定状态,即用一个变量(可以肯定的,它是线程安全的)。 locked = true。然后,通讯2可以等到它的解锁。

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()
© www.soinside.com 2019 - 2024. All rights reserved.