我想测试用Erlang编写的互斥信号量。导出的函数是:
然后,从erlang控制台:
mutex:start().
mutex:wait().
如何执行另一个互斥锁:wait()来测试信号量?
我尝试创建2个erlang节点(erl -sname
),并使用rpc:call(node, mutex, wait, [])
我可以这样做但是当我尝试信号 - rpc:call(node, mutex, signal, [])
时 - 它会创建另一个不同于那个的Pid进行等待调用,因此信号量永远不会被释放。
感谢您的帮助。谢谢!
如果需要,这是代码*来自Erlang Programming Book *
-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.
答案 0 :(得分:1)
从shell执行:
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>
离开我的头顶,所以这里没有返回值。你也可以通过产生更多的过程来使它变得更有趣,并且可能包括睡眠,以便它们等待并以更复杂的方式发出信号。
答案 1 :(得分:0)
您不应该需要两个完整的erlang VM来测试它。我很久以前在erlang中编写了一个锁服务器(通过一个简单的基于tcp的协议提供这样的东西)并且对核心进行了相当完整的测试:
https://github.com/dustin/elock/blob/master/src/lock_serv_test.erl