2007年2月21日 星期三

Command與Telnet的架構

由於一般的Telnet是採取"Per connection per thread"的策略,因此有時候某些Connection執行的指令,若是毫無防範,將會造成Deadlock的情況(例如move指令,因為會一次鎖兩個房間,若兩個房間同時有Connection要移動到對方房間,就有可能造成Deadlock),因此,所有有可能造成資源synchronized的指令都要予以集中保管。

基本上,所有會造成MudObject狀態改變的指令都要集中保管。我採用的是Productor/Customer pattern,所有Connection都是Productor,當他們發出有可能造成狀態改變的指令,必須將之submit to a synchronized Command Queue,若不會造成改變(例如一般不會觸發mob程式的談話命令),則直接doCommand執行。而Timer會以1/10的頻率詢問此synchronized Queue,並執行其中的命令。

這樣的策略就不會讓Command造成Connection€之間的鎖死情形出現了。

沒有留言: