2017-04-21 97 views
0

我必須編寫一個程序,基本上是一個遊戲 - 簡而言之,有士兵(線程)收集資源,卸載基地中的資源,訓練自己和其他一些東西。我一直在閱讀關於線程以及如何使用它們進行固定的6-7小時馬拉松,但我想我需要一些幫助。所以,我可以寫一個非常簡單的程序,使用一個函數的線程,讓我們說一個打印「你好,我是線程號:N」的函數。但是,我沒有得到 - 例如,如果我們用print語句查找這個簡單的程序,我們給每個線程一個指向函數的指針,並且這些都是有趣和遊戲。但是,在我的情況下,我必須做多個功能,而我沒有得到的是我如何使所有線程都通過所有不同的功能?主要思想是使用互斥鎖和condvars,但是因爲我可以給它的參數中的每個線程只有一個函數指針,所以我不知道我該如何完成這個任務,因爲我有3-4個函數。我不認爲爲每個功能創建一個線程解決了這個問題,這是爲什麼:在C編程中的線程(linux)

Game begins! 
Worker 1 is searching 
Worker 1 is transporting 
Worker 1 unloaded resources to Base station 
Worker 2 is searching 
Worker 2 is transporting 
Worker 2 unloaded resources to Base stationW 
Operation not supported 
Worker 3 is searching 
Worker 3 is transporting 
Worker 3 unloaded resources to Base station 
..... 
b 
Not enough resources 
Worker 4 is searching 
Worker 4 is transporting 
Worker 4 unloaded resources to Base station 
... 
b 
Worker 3 is constructing new building barracks 
Worker 2 is searching 
Worker 2 is transporting 
Worker 2 unloaded resources to Base station 
.... 
Worker 3 completed new building barracks 
w 
Warrior is being trained 
Worker 3 is searching 
Warrior is ready for duty 

這必須是遊戲的輸出。不要介意W和B--只有一些必須滿足特定條件才能運行的操作。 所以我的問題是 - 我應該爲每個功能使用一個線程?我不想讓你解決我的問題,我將非常樂意啓發我,我應該如何解決這個問題,非常感謝!

+0

將對象(如士兵)建模爲線程是一個非常糟糕的主意。重新思考你的設計。 – nwp

+0

這是我的任務,我必須這樣做。這不是我的想法。 –

回答

0

每個線程都有一個函數,它在開始運行,但該函數可以調用他人。它類似於程序主線程開始運行的main()函數。

從您的示例輸出中,您似乎希望每個線程運行一個循環,循環重複執行一系列步驟(搜索,傳輸等)。每個步驟都可以涉及調用一個或多個其他功能。這些函數可以做一些事情,比如阻塞條件變量,以等待資源的可用性。

有關說明:除了函數指針,pthread_create僅允許您將單個arg指針作爲數據傳遞給線程。假設你的線程需要多個指針信息,你需要創建一個struct來存放線程需要的任何信息,並傳遞一個指針。

+0

所以基本上你是說爲每個函數創建一個線程,循環直到滿足條件並返回一些值?這讓我想問,如果例如我有一個gatherResources函數,並讓我說我得到5資源,我怎麼能存儲這個我一個全局變量和/或返回到主?據我所知使用pthread_ext(N) - 在我們的例子中,N是讓我們說5,然後在主線程pthread_join(threadName,[storeNhere])中?你能否向我解釋一下這個問題 –

+0

不,我要說的是爲每個士兵創建一個線程,並且讓它完成一個士兵需要做的所有事情 - 包括*調用像gatherResources和deliverResources這樣的函數,並且可能涉及循環,因爲焊料在交付第一批後應該收集更多資源。 – Wyzard

+0

如果我必須創建士兵怎麼辦?我是否應該爲soldierCreation寫一個函數,爲它使用線程並在每次創建士兵時增加一個全局變量? –