2011-01-13 50 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> 

關閉我的頭頂,所以沒有返回值在這裏。你也可以通過產生更多的過程使它更有趣,也許還包括睡覺,讓它們以更復雜的方式等待和發出信號。