如何使用多个Pid测试Erlang互斥体信号量?

如何使用多个Pid测试Erlang互斥体信号量?,erlang,Erlang,我想测试一个用Erlang编写的互斥信号量。导出的函数包括: 启动/0,->以启动互斥服务器 停止/0,->以停止互斥服务器 等待/0,->,将信号量置于忙碌状态 信号/0,->以释放信号量 然后,从erlang控制台: mutex:start(). mutex:wait(). 如何执行另一个互斥体:wait()来测试信号量 我尝试创建两个erlang节点(erl-sname),并使用rpc:call(node,mutex,wait,[])我可以做到这一点,但当我尝试signal-rpc:

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

  • 启动/0,->以启动互斥服务器
  • 停止/0,->以停止互斥服务器
  • 等待/0,->,将信号量置于忙碌状态
  • 信号/0,->以释放信号量
然后,从erlang控制台:

mutex:start().
mutex:wait().
如何执行另一个互斥体:wait()来测试信号量

我尝试创建两个erlang节点(
erl-sname
),并使用
rpc:call(node,mutex,wait,[])
我可以做到这一点,但当我尝试signal-
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.

您不需要两个完整的erlang虚拟机来测试这一点。很久以前,我在erlang中编写了一个锁服务器(通过一个简单的基于tcp的协议提供这些东西),并对核心进行了相当完整的测试:


您不需要两个完整的erlang虚拟机来测试这一点。很久以前,我在erlang中编写了一个锁服务器(通过一个简单的基于tcp的协议提供这些东西),并对核心进行了相当完整的测试:

从外壳中执行以下操作:

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>
在我的头顶上,所以这里没有返回值。您还可以通过生成更多进程,并可能在其中包含休眠,使它们以更复杂的方式等待和发送信号,从而使其更有趣。

来自shell do:

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>

在我的头顶上,所以这里没有返回值。你也可以通过产生更多的进程来让它变得更有趣,也许其中包括睡眠,以便它们以一种更复杂的方式等待和发出信号。

在我的头顶上,这听起来很矛盾:)希望大部分来自我的大脑。:-)在我的脑海里,这听起来很矛盾:)希望大部分来自我的内心。:-)优秀的代码。我会把你留作将来的参考。谢谢!优秀的代码。我会把你留作将来的参考。谢谢!