2017-04-21 8 views
0

基本的にはゲームを書く必要があります。要するに、リソースを集めたり、ベースでリソースをアンロードしたり、自分や他のものを訓練する兵士(スレッド)があります。私は糸について読んできましたし、すでに6-7時間のマラソンを実践するためにそれらを使う方法はありますが、私はいくつかの助けが必要だと思います。だから、私は1つの関数を使用するスレッドで非常に単純なプログラムを書くことができます、 "こんにちは私はスレッド番号:N"を印刷する関数を言うことができます。しかし、私が得意でないもの - たとえば、print文でこの簡単なプログラムを調べると、各スレッドに関数へのポインタが与えられ、それはすべて楽しいゲームです。しかし、私の場合、私は複数の機能を実行する必要があり、私は何を得ないのですか?どのようにすべてのスレッドがすべての異なる機能を経由することができますか?主なアイデアは、mutexesとcondvarsを使用することですが、私は各スレッドにその引数の関数ポインタを1つだけ与えることができるので、私は3-4のような機能を持っているので、私はこのタスクを達成する方法がわかりません。私は各機能のための1つのスレッドの作成が問題を解決するとは思わない、ここに理由は次のとおりです。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は気にしないでください。実行するためには特定の条件を満たさなければならない操作があります。 私の質問は - 私は各機能に1つのスレッドを使用する必要がありますか?私はあなたが私の問題を解決することを望んでいない、私はちょうど私がこれにアプローチする必要があります、私に教えて非常に幸せになる、非常にありがとう!

+0

スレッドとしての兵士などのオブジェクトのモデリングは、本当に悪い考えです。あなたのデザインを考え直してください。 – nwp

+0

これは私の仕事です。私はそうする必要があります。それは私の考えではありません。 –

答えて

0

各スレッドは、が起動してが起動する単一の機能を持ちますが、その機能は他のスレッドを呼び出すことができます。これは、プログラムのメインスレッドが実行を開始するmain()関数に似ています。

サンプル出力から、各スレッドが一連のステップ(検索、転送など)を繰り返し行うループを実行するように見えます。各ステップは、1つまたは複数の他の機能を呼び出すことを含むことができる。また、これらの関数は、リソースの可用性を待つために条件変数をブロックするようなことを行うことができます。

関連する注:関数ポインタに加えて、pthread_createは、スレッドとして単一のargポインタを渡すことができます。あなたのスレッドが1つのポインター分以上の情報を必要としていると仮定すると、スレッドに必要な情報を保持し、それにポインターを渡すためにstructを作成することが望ましいでしょう。

+0

したがって、基本的には、各関数のスレッドを作成し、条件が満たされて何らかの値が返るまでループすると言っていますか?これは私に、例えば私がgatherResources関数を持っていて、私が5つのリソースを取得すると言うことができるかどうか聞いてみたいと思います。これをグローバル変数に格納したり、メインに戻したりできますか?私の知る限り、pthread_ext(N)を使用しています - ここでNは私たちの場合、5番目のpthread_join(threadName、[storeNhere])にありますか?あなたはこれを私に説明してください。 –

+0

いいえ、私は、各兵士のためのスレッドを作成し、兵士が行う必要があるすべてのことを行うと言っています - 'gatherResources'や' deliverResources'のような*はんだが最初のバッチを配送した後にもっと多くのリソースを集める必要があるため、おそらくループを伴います。 – Wyzard

+0

もし私が兵士を作る必要があれば?私はsoldierCreationの関数を書くだけで、スレッドを使用して、兵士が作成されるたびにグローバル変数をインクリメントしますか? –