如何使用多个Pid测试Erlang互斥体信号量?
我想测试一个用Erlang编写的互斥信号量。导出的函数包括:如何使用多个Pid测试Erlang互斥体信号量?,erlang,Erlang,我想测试一个用Erlang编写的互斥信号量。导出的函数包括: 启动/0,->以启动互斥服务器 停止/0,->以停止互斥服务器 等待/0,->,将信号量置于忙碌状态 信号/0,->以释放信号量 然后,从erlang控制台: mutex:start(). mutex:wait(). 如何执行另一个互斥体:wait()来测试信号量 我尝试创建两个erlang节点(erl-sname),并使用rpc:call(node,mutex,wait,[])我可以做到这一点,但当我尝试signal-rpc:
- 启动/0,->以启动互斥服务器
- 停止/0,->以停止互斥服务器
- 等待/0,->,将信号量置于忙碌状态
- 信号/0,->以释放信号量
mutex:start().
mutex:wait().
如何执行另一个互斥体:wait()来测试信号量
我尝试创建两个erlang节点(erl-sname
),并使用rpc:call(node,mutex,wait,[])
我可以做到这一点,但当我尝试signal-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.
您不需要两个完整的erlang虚拟机来测试这一点。很久以前,我在erlang中编写了一个锁服务器(通过一个简单的基于tcp的协议提供这些东西),并对核心进行了相当完整的测试:
您不需要两个完整的erlang虚拟机来测试这一点。很久以前,我在erlang中编写了一个锁服务器(通过一个简单的基于tcp的协议提供这些东西),并对核心进行了相当完整的测试: 从外壳中执行以下操作:
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>
在我的头顶上,所以这里没有返回值。您还可以通过生成更多进程,并可能在其中包含休眠,使它们以更复杂的方式等待和发送信号,从而使其更有趣。来自shell do:
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>
在我的头顶上,所以这里没有返回值。你也可以通过产生更多的进程来让它变得更有趣,也许其中包括睡眠,以便它们以一种更复杂的方式等待和发出信号。在我的头顶上,这听起来很矛盾:)希望大部分来自我的大脑。:-)在我的脑海里,这听起来很矛盾:)希望大部分来自我的内心。:-)优秀的代码。我会把你留作将来的参考。谢谢!优秀的代码。我会把你留作将来的参考。谢谢!