В настоящее время у меня есть простой банковский счет, написанный с использованием erlang, у меня также есть тот же банковский счет, переписанный с целью взаимного исключения, идея состоит в том, что невозможно сделать два депозита, где баланс набора/получить может быть interupted так, чтобы конечное значение является неправильным, например, BAL а = 10 бал B = 20:Тестирование на взаимное исключение в Erlang
WRONG
get_bal.A 0 → get_bal.B 0 → set_bal.A 10 → set_bal.B 20 == 20
RIGHT
get_bal.A 0 → set_bal.A 10 → get_bal.B 10 → set_bal.B 30 == 30
Мой код исходный код выглядит следующим образом:
-module(bank).
-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(bank, 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).
идея заключается в том, чтобы создать чтобы я мог получить ошибку, если окончательный баланс может быть неправильным и пройти, если он идет как и планировалось. Мой переписан код также следующим образом:
account(Balance) ->
receive
{deposit, Amount, From} ->
NewBalance = Balance + Amount,
From ! {deposit, Amount, NewBalance},
account(NewBalance);
{withdraw, Amount, From} when Amount > Balance ->
From ! {error, {insufficient_funds, Amount, Balance}},
account(Balance);
{withdraw, Amount, From} ->
NewBalance = Balance - Amount,
From ! {withdrawal, Amount, NewBalance},
account(NewBalance);
{get, From} ->
From ! {balance, Balance},
account(Balance);
stop -> ok
end.
deposit(Amount) when Amount > 0 ->
account_process ! {deposit, Amount, self()},
receive
{deposit, Amount, NewBalance} ->
{ok, NewBalance}
end.
withdraw(Amount) when Amount > 0 ->
account_process ! {withdraw, Amount, self()},
receive
{withdrawal, Amount, NewBalance} ->
{ok, NewBalance};
Error ->
Error
end.
Спасибо за чтение и любая помощь будет очень признателен.
Я обновил свой ответ с помощью образца кода. Я повторно реализовал вашу банковскую функциональность в качестве gen_server Erlang.Это более «Erlangy» способ построения банковских функций. – Stratus3D