Clojure的"发送"是异步的吗?

And*_*ron 2 clojure

我正在使用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就排队操作而言,并不是同步的).

它是否正确?

Stu*_*rra 6

sendsend-off保证在单个线程内按照发送顺序将动作置于代理的队列中.更新代理的队列同步进行.

我希望你有一个简单的竞争条件,虽然我无法从描述中识别它.