モジュールに変数があり、変数値を更新する受信メソッドがあります。複数のプロセスが同時にこのメソッドを呼び出しています。 1つのプロセスがそれを変更しているときにこの変数をロックする必要があります。 Erlangの異なるプロセス間で変数をロックする方法はありますか
以下mytest.erl
%%%-------------------------------------------------------------------
-module(mytest).
%% API
-export([start_link/0,display/1,callDisplay/2]).
start_link()->
Pid=spawn(mytest,display,["Hello"]),
Pid.
display(Val) ->
io:format("It started: ~p",[Val]),
NextVal=
receive
{call,Msg}->
NewVal=Val++" "++Msg++" ",
NewVal;
stop->
true
end,
display(NextVal).
callDisplay(Pid,Val)->
Pid!{call,Val}.
としてサンプルはそれを
Pid=mytest:start_link().
2つのプロセスを開始します
私はそれが "ウォルター" を追加することを願って
同じ時間にP1=spawn(mytest,callDisplay,[Pid,"Walter"]),
P2=spawn(mytest,callDisplay,[Pid,"Dave"]).
それを呼んでいます、 "Dave"、 "Hello Walter Dave"のようなものがありますが、一緒に走っている人が多すぎる場合、いくつかの名前(Walter、Dave、e tc)が上書きされます。
P1、P2が同じ時刻に開始したとき、Valは両方とも「Hello」です。 P1は "Walter"を "Hello Walter"に追加し、P2は "Dave"を追加して "Hello Dave"になります。 P1は最初にNextValに "Hello Walter"として保存し、P2はそれをNextValに "Hello Dave"として保存したので、結果は "Hello Dave"になります。 「Hello Walter」は「Hello Dave」に置き換えられ、「Walter」は永遠に失われます。
「Val」をロックする方法はありますか?「Walter」を追加すると、「Dave」は値の設定が完了するまで待機しますか?
次
display/1
コールのためdisplay/1
パラメータです。メッセージは同時に処理されるのではなく、順次処理されます。これは起こってはならない。この現象を再現するための完全なコードを投稿できますか? – Dogbertクライアントに問題がある可能性があります。 'callDisplay'プロセスのどれかがタイムアウトなどのエラーを出しますか? –