2010-03-28 103 views
5

我必須模擬一個遊戲,每個玩家都轉過身,需要「注意」發生了什麼。多線程或線程進程

到目前爲止,我知道我需要兩個線程每個球員,一個將休眠,直到玩家的回合和其他關注。

我的問題是:我應該工作,每個玩家作爲一個「叉」和叉線程,或者只是創建玩家一些線程,並將它們以某種方式聯繫起來?

這是第一次,所以我不知道的良好做法和編程風格我已經併發,信號量和線程的工作。

+0

我的猜測是你的任務是你使用每個玩家的線程。如果是這樣,你應該在你的問題中說清楚。另外,每個玩家是一個人還是他/她的遊戲界面的線程,還是玩家的線程?另外,你需要在什麼平臺上運行?我假設一些* nix。 – nategoose 2010-03-28 23:37:19

+0

@nateg,因爲他不需要代碼,所以平臺幾乎不相關。 – 2010-03-28 23:40:29

+0

@亨克:Windows有fork()嗎?我認爲該平臺在抽象層面是相關的。 – Duncan 2010-03-29 00:34:45

回答

3

你無意中發現了一個巨大的宗教戰爭的邊緣,圍繞問題旋轉

是否應事件驅動程序使用多個線程或者使用一個事件循環寫?

線程陣營認爲,像「玩家」這樣的單個實體在寫成實際線程時更容易編程,當他們不再需要時可能會放棄處理器。關於玩家狀態的信息可以存儲在局部變量中,甚至存儲在程序計數器中。但是對於線程,您可能不得不擔心原子性,死鎖以及併發編程的其他樂趣。

事件驅動的陣營認爲,當每個實體都能夠響應每個事件時,獲得整個應用程序就會更簡單,並且該實體獲得處理器所需的時間量事件(最好是有限的,通常最好是短的)。不需要擔心併發性,因爲每個事件處理程序都以原子方式執行,但是存在編程成本:當事件處理程序結束時,其所有過程都會退出,因此有關其狀態的信息必須存儲在分配給堆。

當一個實體具有複雜的控制流或想要使用很多抽象時,線程故事往往會發光—這兩個都很難在沒有線程的情況下編碼。當處理程序非常簡單時,事件故事就會發光—讓每個處理程序都以原子方式執行而不必擔心它,這很好,並且它簡化了實體之間的通信。

繼續你的任務之前,找出你的教練屬於哪個宗教團體

既然你問起線程,我強烈建議在大衛漢森的C Interfaces and Implementations線程和渠道庫。該軟件是免費的,這本書是值得購買—它包括很多其他模塊,這將是任何人寫家庭作業非常有用的C.

我應該工作,每個玩家作爲一個「叉」和線程叉,或者只是爲玩家創建一些線程,並以某種方式關聯它們?

除非你被要求使用fork,我會避免它—用於Unix進程間通信的機制是不是愉快的使用。如果你能得到漢森圖書館,我會說每個玩家創建一個線程,並且使用漢森的頻道讓玩家彼此(以及遊戲服務器,這也應該是一個線程)進行通信。

+0

使用fork不是必需的,因爲一般的建議是避免Unix進程之間的通信,所以我會選擇線程。我會盡快完成任務,並有時間看看流程方式(只是爲了知道它們會有多不愉快)。感謝您的答案和書中的建議。 – sergiobuj 2010-03-29 02:38:19

1

在回合制的情況下(遊戲),你其實不需要線,纖維/協同程序會做(好)。

「注重」不需要一個線程,給國家(-changes)剛剛訪問,當您準備再次採取行動。