如何测试具有多个Pid的Erlang互斥信号量?

时间:2011-01-13 22:13:46

标签: erlang

我想测试用Erlang编写的互斥信号量。导出的函数是:

  • 开始/ 0, - >启动互斥服务器。
  • 停止/ 0, - >停止互斥服务器。
  • 等待/ 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 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.

2 个答案:

答案 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