2009-03-13 2 views
0

データを受け取るときに、より低いレベルのアプリケーションが常にコールバックRecData(char * buf)を呼び出すアプリケーションを使用しています。2つのスレッド、つまり消費者用とプロデューサ用のキューを使用する方法

コールバックで私は2つのスレッドを作成し、これらの作成されたスレッドにコンシューマとプロデューサ関数を渡しています。

マイコード:

空隙RecData(チャー*のBUF) {

CreateThread(NULL,0,producer_queue,(void *)buf,0,NULL); 
CreateThread(NULL,0,consumer_queue,NULL,0,NULL); 

}

上記作品Iは、一度に1つのデータを受信します。私が5つのデータをほぼ同時に受け取った場合、producer_queueは最初にすべてのデータをキューに入れ、次にconsumer_queueがデータの取得を開始するはずですが、ここでproducer_queueが最初のデータをキューに入れるとすぐにconsumer_queueが取得します。

+0

データを受信するたびに2つのスレッドをスポーンする理由はありますか? – Alan

+0

私の唯一の動機は、キュー内のデータをエンキューしてからキューからデータを読み込むことですが、RecData(char * buf)関数にプロデューサ用のスレッドを1つだけ入れると、キューからデータを読み込む方法とタイミングが変わります。 助けてください –

+0

もう1つの方法は、1つのリーダースレッドを生成することです。 RecCallバックでは、キューをロックしてデータをエンキューします。あなたのリーダースレッドは、キューからデータをループするでしょう。ちょっとした考え。 – Alan

答えて

1

あなたがしたいことは、私が考えているのはキューへの制御アクセスです。 mutexを使ってキューからの読み込みを制御する方法を見てみましょう。

データを受信すると、ミューテックスをロックしてデータをエンキューします。データのキューイングが完了したら、ロックを解除します。

キューから読み込むと、mutexがロックされているかどうかがわかります。キューにデータを書き込む場合、プロデューサスレッドがすべてのデータの書き込みを完了してロックを解除するまで、読み込みを開始することはできません。実際にミューテックスをロックすると、データを読み込んでいる間にライタースレッドが書き込まないようにします。

このアプローチでは、デッドロックが発生する可能性があります。あなたの作家スレッドがロックを解除する前に死んでいるなら、あなたのリーダースレッドは続行できません(そして、あなたのスレッド死にかけはエラー状態を引き起こすかもしれません)。

これは意味があると思います。

+0

こんにちはアラン、私のQuesで述べた上記のコードで実際に何が起こるのは、プロデューサーのスレッドと消費者は常に互いに次々に作られています。 –

+0

RecData(char * buf)コールバックがほぼ同時に5つのデータを受け取った場合、最初のデータをキューに書き込む場合、それをキューに書き込んだプロデューサ用のスレッドを作成し、次にスレッド(コンシューマ)データを読み込み、次のデータについても同様のことが起こります。 –

+0

プロデューサが5つのデータをすべてキューに書き込む必要があり、次にコンシューマスレッドがキューから5つのデータを読み込む必要があるように、5つのデータを受け取ったときのように動作させたい。出来ますか? ありがとう –

0

条件変数の概念を使用します。あなたが持っている問題は、マルチスレッドプログラミングの世界で最も一般的なものです。ミューテックスを使用しても、状況には役立ちません。 mutexはロックのためのものであることを常に覚えておいてください。&条件変数は待機用です。スレッドが共有キューから消費を開始する必要がある場合、後は常に安全でほぼ確実です。

Windows上で自分で条件変数を作成することができます方法については、以下のリンクをご覧ください:あなたは、MSDNの例の下に、Windows Vistaのを使用している場合 http://www.cs.wustl.edu/~schmidt/win32-cv-1.html

はあなたを助けるかもしれない: http://msdn.microsoft.com/en-us/library/ms686903(VS.85).aspx

どのような場合でも、Schmidtのウェブサイトに示されているようにロジックを使用してください。これはより移植性があります(Windowsの異なるバージョンでは移植性があります)。 Schmidtの実装は、最新のUNIX/LINUXシステムで広く使われている標準のPOSIX APIの標準を提供します。

+0

あなたのmsdnリンクは少しボルケードです。 –

関連する問題