在Erlang中,发送到self是原子的吗?

问题描述 投票:0回答:1

据我所知,Erlang 总是处理

receive
邮箱中[到达]的第一条消息,这些消息是与模式匹配的。我很好奇这是否可以用来获得以下假设:

如果一个进程

a
做了

self() ! its_me,
b ! go,
receive
   X -> X
end.

而且

b
确实

receive
  _ -> a ! its_not_me
end

那么我有没有保证

a
会先收到自己发来的消息(
X = its_me
)?


我的一些推理

问题涉及如何实现 send-to-self 或 send-within-node ;是否立即将消息放入队列中,或者消息是否在某个时刻“在路上”并且可能被其他消息超越。

如果

a
b
都会将消息发送给其他
c
,那么
c
是否会收到
its_me
its_not_me
显然是不确定的。然而,在这里我有更多前提:

  • a
    a
    发送到
    a
     之前发送到 
    b
  • b
    的 mbox 在
    a
    接收来自
    b
     之前从 
    a
  • 接收
  • b
    a
    发送到
    b
     之前从 
    a
  • 接收
  • (结论)
    a
    必须在其消息框收到来自
    b
  • 的消息之前完成对自身的发送

我想知道的是,结论是否意味着

a
的mbox先于
a
接收到来自
b

的消息
asynchronous concurrency erlang message-queue
1个回答
0
投票

据我所知,理论上的答案是否定的。来自信号传递手册部分

给出的唯一信号排序保证如下:如果一个实体向同一目标实体发送多个信号,则保留顺序;也就是说,如果
A

S1
发送信号
B
,然后再向
S2
发送信号
B
,则保证
S1
不会在
S2
之后到达。请注意,
S1
可能已丢失,也可能未丢失。

这里的情况并非如此:
a

b
都不会向同一目标实体发送多个信号。
这个答案是理论上的,因为首先传递消息 

its_not_me

的 Erlang 实现不会被认为是不正确的。实际上,由于您在问题中指出的原因,我认为 Erlang 实现实际上不太可能做到这一点。

    

© www.soinside.com 2019 - 2024. All rights reserved.