Как я могу протестировать семафор мьютекса Эрланга с более чем одним Pid? - PullRequest
0 голосов
/ 14 января 2011

Я хочу протестировать семафор мьютекса, написанный на Erlang.Экспортируемые функции:

  • start / 0, -> для запуска сервера мьютекса.
  • stop / 0, -> для остановки сервера мьютекса.
  • wait / 0, -> Чтобы перевести семафор в занятое состояние.
  • signal / 0, -> Чтобы освободить семафор.

Затем, с консоли erlang:

mutex:start().
mutex:wait().

Как выполнить другой мьютекс: wait () для проверки семафора?

Я попытался создать 2 узла erlang (erl -sname), и с помощью rpc:call(node, mutex, wait, []) я могу это сделать, но когдая пробую сигнал - rpc:call(node, mutex, signal, []) - он создает другой Pid, ​​отличный от того, который делает ожидание вызова, поэтому семафор никогда не освобождается.

Благодарим вас за помощь.Спасибо!.

Это код, если необходимо * Из книги программирования Erlang *

-module(mutex). 
-export([start/0, stop/0]). 
-export([wait/0, signal/0]). 
-export([init/0]). 

start() -> 
   register(mutex, spawn(?MODULE, init, [])). 

stop() -> 
   mutex ! stop. 

wait() -> 
   mutex ! {wait, self()}, 
   receive ok -> ok end. 

signal() -> 
   mutex ! {signal, self()}, 
   ok. 

init() -> 
   free(). 

free() -> 
   receive 
      {wait, Pid} -> 
         Pid ! ok, 
         busy(Pid); 
      stop -> 
         terminate() 
   end. 

busy(Pid) -> 
   receive 
      {signal, Pid} -> 
         free() 
   end. 

terminate() -> 
   receive 
      {wait, Pid} -> 
         exit(Pid, kill), 
         terminate() 
   after 
      0 -> ok 
   end.

Ответы [ 2 ]

1 голос
/ 14 января 2011

Из скорлупы делаем:

1> mutex:start().
2> mutex:wait().
3> spawn(fun () -> mutex:wait(), io:format("Got it\n"), mutex:signal() end).
4> mutex:signal().
Got it
5>

С макушки головы, поэтому здесь нет возвращаемых значений. Вы также можете сделать его более интересным, создав больше процессов и, возможно, включив в них сны, чтобы они ждали и сигнализировали более сложным образом.

0 голосов
/ 14 января 2011

Вам не нужно две целые виртуальные машины Erlang, чтобы проверить это.Я давно написал сервер блокировки на эрланге (предоставляет такие вещи с помощью простого протокола на основе tcp) и провел довольно полный тест для ядра:

https://github.com/dustin/elock/blob/master/src/lock_serv_test.erl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...