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

Do you risk triggering race conditions when sending large messages in Erlang?

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

C会不会收到A发来的完整消息,然后继续处理B发来的消息?还是 C 可能会接收 A 的消息块以及 B 的消息块?

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

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

  1. 在发送过程中分配一个目标内存space(称为环境)。
  2. 将消息复制到那个内存space
  3. 获取目标进程的外部锁
  4. Link 留言进入邮箱链表
  5. 释放目标进程的外部锁

如您所见,复制是在临界区外(之前)完成的,而且临界区速度非常快。这只是一些指针的杂耍。