嗨问题如下: 假设我们有链接的进程A和B.进程的标志trap_exit设置为true。让B进程向A发送一个msg,然后退出:
PidA ! 'msg',
exit(reason).
我想知道我们是否可以确保过程A会收到'msg'并且只有在它'{EXIT',Pid,reason}将会到来之后?我们可以预测msgs的排序吗?我在文档中找不到任何证据,但我想它会以这种方式工作,但我需要一些证明。不想在这里有竞争条件..
答案 0 :(得分:7)
至于不要把这个问题挂起来。这是erlang-questions邮件列表中的讨论:
http://thread.gmane.org/gmane.comp.lang.erlang.general/66788
长话短说:所有消息都是信号(或所有信号都是消息),退出被视为来自进程的消息,保证按照发送的顺序到达。
答案 1 :(得分:2)
听起来像是一股代码味道。为什么你需要依赖trap_exit
?你有没有想过替代品,例如适当的监控?
答案 2 :(得分:1)
我在这里有O'Reilly Erlang编程书,在第4章的Message Passing一节中,它说:
邮件按邮件递送的顺序存储在邮箱中。如果两个消息从一个进程发送到另一个进程,则保证以与发送它们相同的顺序接收消息。但是,此保证不会扩展到从不同进程发送的消息,在这种情况下,排序依赖于VM。
但是,在您的情况下,我不确定退出消息是否实际来自进程B.它可能源自VM的内容。如果我想确定,我实际上会在收到您的通知消息时触发进程A的退出。