2015-06-08 4 views
3

В erlang, если два процесса A и B отправляют сообщение процессу C одновременно. Будет ли состояние гонки?erlang сообщение передача архитектуры

  • C! {очень большое сообщение} послал мимо A
  • C! {очень большое сообщение} послан B

Будет С получить полное сообщение от А, а затем перейти на сообщение от B? или возможно, что C, вероятно, будет получать куски сообщения A вместе с кусками сообщения B?

ответ

5

Получение сообщений является атомной операцией.

Если вам интересно, как это делается, прочитайте исходный код виртуальной машины. Если я упрощаю это, процесс отправки выполняет следующие этапы:

  1. Выделить целевое пространство памяти в процессе отправки (это называется средой).
  2. Скопируйте сообщение в этой памяти пространства
  3. Возьмите внешнюю блокировку на целевом процессе
  4. сообщение Ссылка на почтовый ящик связанный список
  5. Release внешний замок на целевом процессе

, как вы можно увидеть, что копирование выполняется вне (до) критического раздела, а критический раздел выполняется довольно быстро. Это просто жонглирование несколькими указателями.

Смежные вопросы