我建立了一个多玩家游戏使用二郎神的消息传递结构(准确的说,4名选手)。以下链接中的tictactoe游戏为例,但真正类似于游戏中显示的消息传递构造:如何解决竞争条件之间的函数调用
然后我选择在ejabberd多用户聊天室上运行此游戏,这是一个ejabberd钩子。 但是,如果你在上面的链接上的文件tictactoe.erl看NewGameState,你会发现,没有检索的方式,在一个变量 出来。
所以我用的Mnesia并写了产生这种Mnesia表上的每一个新的游戏状态。 现在在我的ejabberd钩我把我的游戏功能(即每次通话的一系列模块 - >“gen_server,game_modules,mnesia_modules”执行) 和挂钩只是游戏功能的调用下面里面我从Mnesia表上的读数为如下的游戏状态(这里的功能myMessage是ejabberd钩里面的功能):
myMessage({#message = Msg, C2SState})->
some_other_module:game_func(Args),
State=mnesia_module:read(key),
{Msg, C2SState};
myMessage(Acc) ->
Acc.
现在我的问题是,读操作是给我一个空表时,执行的顺序是
some_other_module:game_func(Args),
GameState=mnesia_module:read(key),
当我插入这两行之间的延迟为timer:sleep/1
为b
some_other_module:game_func(Args),
timer:sleep(200)
GameState=mnesia_module:read(key),
我正在游戏状态的正确值从而表明我,在线的读操作
GameState=mnesia_module:read(key),
是越来越执行:elow(该值200被一些尝试使用不同的值后随机选择的) /在行some_other_module:game_func(Args)
(它是一系列模块 - >“gen_server,game_modules,mnesia_modules”)之前执行的/能够执行mnesia模块并将GameState写入mnesia表。
我怎样才能解决这个问题,因为我不希望使用timer:sleep/1
,因为它是不可靠的解决方案。
任何人都可以给我一个工作在这里。我的意思是任何人都可以建议我通过除mnesia以外的任何其他方式检索挂钩内的GameState,所以我根本没有竞争条件。
或其中有一些方式,ejabberd提供了一些功能,我可以使用吗?
在此先感谢。
你使用mnesia:dirty_ *函数吗? – Pouriya
no @Pririya我正在使用mnesia:写入/ 1来写入数据,而some_other_module:game_func(Args)正在运行,而mnesia:read/3函数读取数据时GameState = mnesia_module:read(key)被调用。 –
你可以显示代码吗? – Pouriya