Я хочу протестировать семафор мьютекса, написанный на 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.