Concurrency Erlang寄存器错误

Concurrency Erlang寄存器错误,concurrency,erlang,Concurrency,Erlang,我正在编写一个程序,它将接收两个字符串,并将它们连接为一个共享的dropbox。我使用的代码来自另一个应用程序,它在一个联合银行帐户上做了类似的事情,因此出现错误可能是因为我没有正确地更改某些代码行,但我就是无法找出错误所在 代码写在两个单独的文件中,它们链接在一起,首先是基本的dropbox,然后是链接并显示答案的代码,如下所示 -module(dropbox). -export([account/1, start/0, stop/0, deposit/1, get_bal/0, set_ba

我正在编写一个程序,它将接收两个字符串,并将它们连接为一个共享的dropbox。我使用的代码来自另一个应用程序,它在一个联合银行帐户上做了类似的事情,因此出现错误可能是因为我没有正确地更改某些代码行,但我就是无法找出错误所在

代码写在两个单独的文件中,它们链接在一起,首先是基本的dropbox,然后是链接并显示答案的代码,如下所示

-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)