2011-01-13 6 views
0

Ich möchte einen Mutex-Semaphor in Erlang geschrieben testen. Die exportierten Funktionen sind:Wie kann ich einen Erlang Mutex Semaphor mit mehr als einem Pid testen?

  • start/0, -> Um den Mutex-Server zu starten.
  • stop/0, -> Um den Mutex-Server zu stoppen.
  • wait/0, -> Um das Semaphor in den aktiven Zustand zu versetzen.
  • signal/0, -> Um den Semaphor zu befreien.

Dann Von einer erlang Konsole:

mutex:start(). 
mutex:wait(). 

Wie führe ich eine andere Mutex: wait() die Semaphore zu testen?

Ich habe versucht, die Schaffung 2 erlang Knoten (erl -sname) und unter Verwendung rpc:call(node, mutex, wait, []) ich das tun kann, aber wenn ich versuche, das Signal - rpc:call(node, mutex, signal, []) - es schafft eine andere Pid unterscheidet sich von dem, der die Wartezeit Anruf tätigt, so die Semaphore nie freigesetzt wird .

Schätzen Sie Ihre Hilfe. Vielen Dank!.

Dies ist der Code benötigt, wenn * Von Erlang Programming Buch *

-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

Von der Spitze meines Kopfes klingt es oxymoronic :) – EvilTeach

+0

Hoffentlich kommt die meisten aus meinem Kopf. :-) – rvirding

Antwort

1

Von der Shell tun:

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> 

Aus der Spitze meines Kopfes so keine Rückgabewerte hier. Sie können es auch interessanter machen, indem Sie mehr Prozesse hervorbringen und vielleicht auch in ihnen schlafen, so dass sie auf komplexere Weise warten und signalisieren.

0

Sie sollten nicht brauchen zwei ganze erlang VMs dies zu testen. Ich schrieb vor langer Zeit einen Sperrserver in erlang (stellt solche Dinge über ein einfaches TCP-basiertes Protokoll) und hatte einen ziemlich vollständigen Test für den Kern:

https://github.com/dustin/elock/blob/master/src/lock_serv_test.erl

+0

Ausgezeichneter Code. Ich werde dich für zukünftige Referenzen haben. Danke vielmals! – Santiago

Verwandte Themen