2011-01-13 51 views
0

我想测试用Erlang编写的互斥量信号量。导出的功能是:如何测试Erlang互斥信号量与多个Pid?

  • start/0, - >启动互斥服务器。
  • stop/0, - >停止互斥服务器。
  • wait/0, - >使信号量处于繁忙状态。
  • signal/0, - >释放信号量。

然后,从一个Erlang控制台:

mutex:start(). 
mutex: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. 
+0

关闭我的头顶听起来oxymoronic :) – EvilTeach 2011-01-13 22:17:53

+0

希望大多数来自我的头。 :-) – rvirding 2011-01-15 23:22:27

回答

1

从外壳做:

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> 

关闭我的头顶,所以没有返回值在这里。你也可以通过产生更多的过程使它更有趣,也许还包括睡觉,让它们以更复杂的方式等待和发出信号。