11/16/2013

多執行緒伺服器程式感想(多緒方案)

多執行緒真的是一門有趣又困難的技術。
而在多核心電腦當道的趨勢下,
程式設計師也務必將此技術觀念學好、學精。

我在寫伺服器程式時,常常被多緒之間互相存取公用資源而感到困擾。
若一不小心恍神,沒注意到,就可能埋下日後的隱藏性錯誤。

難道沒有一種較佳的多緒方案,能同時實現『撰寫容易』和『高效能』嗎?
這點我仍是在不斷思考中。。。

以下列出一些遊戲伺服器程式比較會用到多緒方案:

〔1〕winsock:簡單型(非封鎖模式)
一個send_thread(可以用main_thread代替),一個accept_thread,一個recv_and_logic_thread。
說明:
這是最簡單的多緒應用,也只用三個緒,『撰寫容易,效能適中』,適合初學者使用。
由於只有一個recv_and_logic_thread,所以多玩家間要互相存取資訊時,
不需要考慮lock/unlock問題,撰寫上就非常方便。
(recv_and_logic_thread的意思是接收封包和邏輯處理都是在同一個緒上完成)

〔2〕winsock:中階型(非封鎖模式)
一個send_thread(可以用main_thread代替),一個accept_thread,一堆recv_thread,一個logic_thread。
說明:
此多緒應用,也是『撰寫容易,效能適中』,send_thread、accept_thread和recv_thread這種緒是可以歸到
game engine層上,剩下的應用層處理就是logic_thread。
這是穩定、安全、簡單、容易分工的程式設計作法。
(我就有一個朋友是採用此方案來設計)

〔3〕winsock:複雜型(非封鎖模式)
一個send_thread(可以用main_thread代替),一個accept_thread,一堆recv_and_logic_thread。
說明:
由於使用了多個recv_and_logic_thread,所以多玩家間要互相存取資訊時,
開始需要考慮lock/unlock問題,撰寫上就變得困難許多。
例如:一堆玩家要同時查詢玩家列表資訊時,就需要互相存取,同時,部份玩家可能也會下線。
此方案適合經驗豐富者使用。

〔4〕IOCP:簡單型
一個send_thread(可以用main_thread代替),一個accept_thread,一堆recv_thread,一個logic_thread。
說明:
要使用IOCP,基本上就是一件複雜的工程,但撇開IOCP複雜的機制不談,
若是只使用一個logic_thread,則撰寫遊戲邏輯時,將會輕鬆許多。
因為不需要考慮玩家間的互相存取問題。可以用一般單緒的思考來撰寫。

〔5〕IOCP:複雜型
一個send_thread(可以用main_thread代替),一個accept_thread,一堆recv_and_logic_thread。
說明:
我想這是最複雜的應用了。運用得好的話,可以徹底發揮多核的功效,
但很難運用得好。。。呵呵~
我目前是採用此方案來設計,有時感到蠻困擾的。會有一些我無法理解的bug現象出現。
而程式中,到處都是lock/unlock,思維都得用多緒來思考,程式撰寫速度會較慢。
優點是...效能是最好的。


簡單說明了這些多緒方案,我還是在想我可以如何改進我的多緒設計。。。
以實現『撰寫容易』和『高效能』。
若有想到什麼時,再補充吧!


謝謝觀賞。

沒有留言: