长话短说,我正在尝试在 Erlang 中复制 Sleeping barber 问题。
在我的解决方案中,我决定将所有正在等待的进程放入一个列表中。然后,一旦进程轮流,我就会将该 PID 从列表中删除。
不幸的是,当我打电话时
length(myListOfPids).
它失败了,例如:
length([<0.46.0>]).
* 2: syntax error before: '<'
有没有办法存储 PID 以便我可以调用它们并正常使用它们? IE。
PID ! message
...以防万一,这是我在运行程序时收到的实际错误:
=ERROR REPORT==== 1-Jul-2010::05:50:40 ===
Error in process <0.44.0> with exit value:
{badarg,[{erlang,length,[<0.46.0>]},{barber1,waitingRoom,2}]}
barber1 是我的模块,waitingRoom 是跟踪哪些进程正在等待的函数
最佳答案
您还可以使用 pid/3 从它的三个组件构造一个 Pid。
1> 长度([pid(0,35,0)])。
请注意,如果您在与创建它的节点不同的节点上构建 pid,则使用这些技术中的任何一种构建 Pid 都会出错。
您的程序遇到的问题不同。
{badarg,[{erlang,length,[<0.46.0>]},{barber1,waitingRoom,2}]}
对 erlang:length/1 的调用创建了一个 badarg。 {erlang,length,[<0.46.0>]} 的第三个元素是传递给 erlang:length 的参数列表。所以这相当于:
1> 二郎:长度(pid(0,46,0))。
您打算在哪里:
1> 二郎:长度([pid(0,46,0)])。
(令人讨厌的是,erlang shell 现在对您隐藏了 erlang 的内部错误表示。将上述错误替换为:
** 异常错误:函数长度/1 中的错误参数称为长度(<0.35.0>)
这更容易理解但不太有用,因为它妨碍了自己学习解释 erlang 错误的基本技能。)
关于concurrency - Erlang 中的 PID 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3156843/