Concurrency Erlang寄存器错误
我正在编写一个程序,它将接收两个字符串,并将它们连接为一个共享的dropbox。我使用的代码来自另一个应用程序,它在一个联合银行帐户上做了类似的事情,因此出现错误可能是因为我没有正确地更改某些代码行,但我就是无法找出错误所在 代码写在两个单独的文件中,它们链接在一起,首先是基本的dropbox,然后是链接并显示答案的代码,如下所示Concurrency Erlang寄存器错误,concurrency,erlang,Concurrency,Erlang,我正在编写一个程序,它将接收两个字符串,并将它们连接为一个共享的dropbox。我使用的代码来自另一个应用程序,它在一个联合银行帐户上做了类似的事情,因此出现错误可能是因为我没有正确地更改某些代码行,但我就是无法找出错误所在 代码写在两个单独的文件中,它们链接在一起,首先是基本的dropbox,然后是链接并显示答案的代码,如下所示 -module(dropbox). -export([account/1, start/0, stop/0, deposit/1, get_bal/0, set_ba
-module(dropbox).
-export([account/1, start/0, stop/0, deposit/1, get_bal/0, set_bal/1]).
account(Balance) ->
receive
{set, NewBalance} ->
account(NewBalance);
{get, From} ->
From ! {balance, Balance},
account(Balance);
stop -> ok
end.
start() ->
Account_PID = spawn(dropbox, account, [0]),
register(account_process, Account_PID).
stop() ->
account_process ! stop,
unregister(account_process).
set_bal(B) ->
account_process ! {set, B}.
get_bal() ->
account_process ! {get, self()},
receive
{balance, B} -> B
end.
deposit(Amount) ->
OldBalance = get_bal(),
NewBalance = OldBalance ++ Amount,
set_bal(NewBalance).
这是我得到的错误,所有其他的我都设法解决了,但我不太明白这一点,所以我不知道如何解决它
** exception error: bad argument
in function register/2
called as register(account_process,<0.56.0>)
in call from dropbox:start/0 (dropbox.erl, line 16)
in call from dropboxtest:start/0 (dropboxtest.erl, line 5)
**异常错误:参数错误
在功能寄存器/2中
称为寄存器(帐户\进程)
从dropbox调用中:开始/0(dropbox.erl,第16行)
来自dropboxtest的in调用:开始/0(dropboxtest.erl,第5行)
我还知道,由于并发性问题,这将出现错误,我需要显示这些错误,以证明哪里出了问题,然后才能修复它。银行程序中的某些功能尚未更改,因此余额等。根据,寄存器
可能会因以下原因而失败:
- 如果
不是现有的本地进程或端口PidOrPort
- 如果
已在使用中RegName
- 如果进程或端口已注册(已具有名称)
- 如果
是原子RegName
未定义的
account\u process
的进程。您可以尝试重新启动Erlang shell,也可以将spawn
调用dropbox:start
更改为spawn\u链接
,这将导致旧进程在shell中出现任何错误时崩溃。根据,寄存器
可能会因badarg
而失败,原因如下:
- 如果
不是现有的本地进程或端口PidOrPort
- 如果
已在使用中RegName
- 如果进程或端口已注册(已具有名称)
- 如果
是原子RegName
未定义的
在本例中,我怀疑这是第二个原因,因为在上一次运行中已经有一个名为
account\u process
的进程。您可以尝试重新启动Erlang shell,或者您可以将spawn
调用dropbox:start
更改为spawn\u link
,这将导致旧进程在shell中出现任何错误时崩溃。我知道这很简单!谢谢我知道这会很简单!谢谢
** exception error: bad argument
in function register/2
called as register(account_process,<0.56.0>)
in call from dropbox:start/0 (dropbox.erl, line 16)
in call from dropboxtest:start/0 (dropboxtest.erl, line 5)