我的模塊中有變量,並且有更新變量值的接收方法。多個進程同時調用這個方法。當一個進程正在修改它時,我需要鎖定這個變量。示例如下有沒有辦法在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().
兩個過程都在同一時間
P1=spawn(mytest,callDisplay,[Pid,"Walter"]),
P2=spawn(mytest,callDisplay,[Pid,"Dave"]).
我希望它可以添加 「沃爾特」 叫它,「戴夫」一個接一個地像「你好,沃爾特戴夫」,然而,當他們中有太多人一起跑步時,一些名字(Walter,Dave,e TC)將被覆蓋。
因爲當P1,P2同時啓動時,Val都是「你好」。 P1添加「Walter」成爲「Hello Walter」,P2添加「Dave」成爲「Hello Dave」。 P1將它首先保存爲NextVal作爲「Hello Walter」,然後P2將它保存爲NextVal作爲「Hello Dave」,因此結果將爲「Hello Dave」。 「你好,沃爾特」被「你好戴夫」取代,「沃爾特」永遠失去了。
有什麼辦法可以鎖定「Val」,所以當我們添加「Walter」時,「Dave」會等待Value設置完成嗎?
進程可以一次只處理一個消息。消息按順序處理,而不是同時處理。這不應該發生。你能發佈完整的代碼來重現這種行爲嗎? – Dogbert
可能是客戶的問題。是否有任何'callDisplay'進程發出錯誤,例如超時? –