在 Erlang 中发送大消息时,您是否有触发竞争条件的风险?
Do you risk triggering race conditions when sending large messages in Erlang?
在 Erlang 中,如果两个进程 A 和 B 同时向进程 C 发送消息。会有竞争条件吗?
- 丙! A
发送的{非常大的消息}
- 丙! B
发送的{非常大的消息}
C会不会收到A发来的完整消息,然后继续处理B发来的消息?还是 C 可能会接收 A 的消息块以及 B 的消息块?
消息接收是一个原子操作。
如果您对它是如何完成的感兴趣,请阅读 VM 的源代码。如果我简化它,发送过程就是执行这些步骤:
- 在发送过程中分配一个目标内存space(称为环境)。
- 将消息复制到那个内存space
- 获取目标进程的外部锁
- Link 留言进入邮箱链表
- 释放目标进程的外部锁
如您所见,复制是在临界区外(之前)完成的,而且临界区速度非常快。这只是一些指针的杂耍。
在 Erlang 中,如果两个进程 A 和 B 同时向进程 C 发送消息。会有竞争条件吗?
- 丙! A 发送的{非常大的消息}
- 丙! B 发送的{非常大的消息}
C会不会收到A发来的完整消息,然后继续处理B发来的消息?还是 C 可能会接收 A 的消息块以及 B 的消息块?
消息接收是一个原子操作。
如果您对它是如何完成的感兴趣,请阅读 VM 的源代码。如果我简化它,发送过程就是执行这些步骤:
- 在发送过程中分配一个目标内存space(称为环境)。
- 将消息复制到那个内存space
- 获取目标进程的外部锁
- Link 留言进入邮箱链表
- 释放目标进程的外部锁
如您所见,复制是在临界区外(之前)完成的,而且临界区速度非常快。这只是一些指针的杂耍。