我正在使用Java的新I/O包为Clojure编写一个简单的网络框架.它管理一个"选择器代理"池,每个选择器代理都有一个选择器.
我dispatch为选择器代理定义了一个动作.此操作会阻止呼叫selector.select().当返回时,选择器代理迭代所选键并执行I/O. 当I/O完成时,选择器代理会自动发送dispatch操作send-off,有效地循环调用selector.select().
当我想添加新频道或更改频道的兴趣操作时,我会向选择器代理发送相应的操作,然后取消阻止选择器(它被阻止select(),记得吗?).这确保了(send-off selector-agent dispatch)在选择器代理之后 执行(send selector-agent add-channel channel).
我认为这将是防弹的,因为调用send-off是在选择器唤醒之前执行的,因此,在选择器代理向自己发送dispatch动作之前执行.但是,这会产生不一致的行为.有时,dispatch动作首先发生,有时则不发生.
我的理解是,不保证代理按照它们来自多个线程时发送的确切顺序执行操作(即send,send-off就排队操作而言,并不是同步的).
它是否正确?
| 归档时间: |
|
| 查看次数: |
675 次 |
| 最近记录: |