2010-09-10 120 views
2

我發現erlang中的互斥量的例子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

你想讓界面看起來像什麼? – rvirding 2010-09-10 17:44:09

回答

0

這不是最好的信號量..可以使用一些隨機的東西,但希望你會明白。

-module(sem1). 
-export([semaphor/2, start/1, start/0]). 

semaphor(0,0) -> 
    io:format("err"); 

semaphor(0,Full)-> 
    receive 
     {increment,PID} -> 
      io:format("UP ~w ~w~n", [0,PID]), 
      PID ! {incGranted}, 
      semaphor(1,Full) 
    end; 


semaphor(Full,Full)-> 
    receive 
     {decrement,PID} -> 
      io:format("DOWN ~w ~w~n", [Full,PID]), 
      PID ! {decGranted}, 
      semaphor(Full -1 , Full) 
    end; 

semaphor(N,Full)-> 
    receive 
     {decrement,PID} -> 
      io:format("DOWN ~w ~w~n", [N,PID]), 
      PID ! {decGranted}, 
      semaphor(N -1 , Full); 
     {increment,PID} -> 
      io:format("UP ~w ~w~n", [N,PID]), 
      PID ! {incGranted}, 
      semaphor(N + 1 , Full) 
    end. 

start(PID) -> 
    PID ! {decrement, self()}, 
    receive 
     {decGranted} -> true 
    end, 
    timer:sleep(100), 
    PID ! {increment, self()}, 
    receive 
     {incGranted} -> true 
    end, 
    start(PID). 

start() -> 
    PID = spawn(sem1, semafor, [1,5]), 
    spawn(sem1,start,[PID]), 
    spawn(sem1,start,[PID]), 
    spawn(sem1,start,[PID]), 
    spawn(sem1,start,[PID]), 
    spawn(sem1,start,[PID]), 
    spawn(sem1,start,[PID]).