2011-11-15 9 views
1

は..このマルチスレッドアプリケーションをスケジュールするにはどうすればよいですか?

いくつかの複雑な作業は、現在の状態は、そのスレッドAであり、B、Cが同時に動作することができます4スレッド

thread -A is calling function_A 
thread -B is calling function_B 
thread -C is calling function_C 
thread -D is calling function_D 

によって分割されているが、これまで、スレッドDはfunction_Dにそれを実行している場合の一例を有することができA、B、Cからのスレッドはそこで実行されていますか?そうであれば、それらが完了するのを待って、a、b、cからのスレッドが関数を実行していないとき、スレッドDは関数Dを実行し始めるでしょう。

どうすればいいのですか?ラフのアイデアは?

EDIT:function_A、function_B、function_cは1つのハンドルを使用しています。 function_Dはそのハンドルを閉じています。その関数を使用している関数があれば、それをfunction_dで閉じてはいけません。

+1

セマフォの使用についてもう少し詳しく知りたい場合は(以下の回答を使用する以外に)、「セマフォの小さな本」http://greenteapress.com/semaphores/を読んでみてください。 – evnu

答えて

7

これは、カウントセマフォの仕事のように聞こえます。

ハンドルを使用する各スレッドは、セマフォ値をインクリメントする必要があります。スレッドDは、セマフォがゼロに達するのを待つ必要があります。

スレッドDが実行されているときにこれを気にせずに実装すると、スレッドDがA、B、またはCより前に実行され、ハンドルをすぐに閉じると驚かないでください。

+0

どのように私はsemaphre 0で待機するスレッドdを作ることができますか?私はsem_wait()を知っていますが、このように使用することはできません。 –

+0

@ Mr.32:おそらく 'semop'と友達を使う必要があります。それらは 'sem_wait'よりも複雑で、より多くのオプションがあります。 –

3

これらのスレッドを自分で同期させる必要があります。OSは同期をとることはありません。
最も簡単な方法は、Semaphoresまたは条件付き変数を使用することです。

+0

セマフォはどのように使うべきですか?任意の小さなラフのアイデア.. –

+1

@ Mr.32:Wikipedia Linkを見てください。単純な言葉で概念を説明しています。簡単に言えば、セマフォは、それらを同期させるためにスレッド間で使用できる共有カウンターだけです。 –

3

同期制御に関する情報を参照する必要があります。

  1. スレッドA-Cは、実行する前に、自身のミューテックス/クリティカルセクションを取得し、それを実行する前に、Dがすべてのミューテックスを取得スレッド:

    は、このような動作を実現するための方法の多くがあることができ、あなたのデザインに依存します。スレッドながら

  2. は、ACは、リーダーロックを取得スレッド、スレッドDは、リーダライタロックを利用しているセマフォ3回

  3. を取得しながら、ACは一度セマフォを取得3.スレッドの数でカウントセマフォを持っていますDは

    すべて....書き込みロック

などを取得し、それはあなたの設計に依存し、あなたのデザインの中で最も合理的である戦略を知っているここでは一つだけです。

+0

すばらしい回答..セマフォ –

関連する問題