在 Erlang 中发送大消息时,您是否有触发竞争条件的风险?

Fai*_*lde 4 erlang messaging process

在 Erlang 中,如果两个进程 A 和 B 同时向进程 C 发送消息。会有竞争条件吗?

  • C !{非常大的消息}由A发送
  • C !{非常大的消息}由B发送

C 会收到来自 A 的完整消息,然后继续处理来自 B 的消息吗?还是 C 可能会同时收到 A 的消息块和 B 的消息块?

Hyn*_*dil 5

消息接收是一个原子操作。

如果您对它是如何完成的感兴趣,请阅读 VM 的源代码。如果我简化它,发送过程正在执行以下步骤:

  1. 在发送进程中分配一个目标内存空间(称为环境)。
  2. 将消息复制到该内存空间
  3. 获取目标进程的外部锁
  4. 将邮件链接到邮箱链表
  5. 释放目标进程的外部锁

如您所见,复制是在临界区之外(之前)完成的,临界区非常快。它只是在玩弄一些指针。