Erlang如何同时处理访问邮箱

时间:2013-08-27 07:36:33

标签: concurrency erlang locking

有很多关于如何使用erlang邮箱的信息,但很少找到纸张或文档描述如何在VM内部同时实现erlang实际访问邮箱。

据我了解,Erlang VM必须执行锁定或CAS操作以确保消息完整性。在erlang帷幕背后是否有任何复杂的方法

2 个答案:

答案 0 :(得分:6)

通过邮箱我假设你的意思是进程邮箱,插入一条消息。有趣的问题!

关于Erlang进程消息队列的锁定特性,有一些对话here

  
    

只是好奇心:目前在发送消息时存在某种锁定。     有没有人试图实现无锁链表:     http://www.amd64.org/fileadmin/user_upload/pub/epham08-asf-eval.pdf

         

或者我只是看错了地方,erts_smp_proc_lock已经存在     用这样的东西?

  
     

消息队列已经有了这种情况。拥有的过程   消息框有一个“内盒”,他有一个锁定和“外部   “所有发件人都在竞争。所以锁争用就在了   许多进程发送到“外部框”时队列的尾部   那个过程。邮箱所有者不关心它。

您可能会发现阅读BEAM process说明的实现。

简短回答:是的,锁定是在消息队列上完成的,但它很复杂并且经过优化可以减少调度程序线程之间的争用。

答案 1 :(得分:3)

有几个锁处理进程结构。关于发送消息最重要的是MSGQ锁定和MAIN锁定。 MAIN锁是在操作时锁定结构字段的锁 - 其中一个字段是传出队列。 MSGQ锁包含传入消息的链接列表。

因此,要发送消息,我们需要获取收件人MSGQ锁定并将消息从我们的队列(由MAIN保护)复制到另一个进程的传入消息队列。

注意这个发送操作的同步异常。进程不会互相阻塞! (大部分时间;)