0

下位レベルのアプリケーションがデータを受信するときに常にコールバック RecData(char *buf) を呼び出すアプリケーションを使用しています。

コールバックでは、2 つのスレッドを作成し、これらの作成されたスレッドにそれぞれ消費者関数と生産者関数を渡します。

私のコード:

void RecData (char * buf) {

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

}

上記は、一度に 1 つのデータを受け取るときに機能します。ほぼ同時に 5 つのデータを受信した場合、producer_queue は最初にすべてのデータをキューに入れ、次に consumer_queue がデータの取得を開始する必要がありますが、ここでは Producer_queue が最初のデータをキューに入れるとすぐに、consumer_queue がそれを取得します。

4

2 に答える 2

1

あなたがしたいのは、キューへのアクセスを制御することだと私は信じています。キューからの読み取りを制御するためにミューテックスを使用することを検討する必要があります。

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

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

このアプローチは、潜在的なデッドロックを引き起こす可能性があります。ロックを解除する前にライタースレッドが停止すると、リーダースレッドは続行できなくなります(この場合も、スレッドが停止するとエラー状態が発生する可能性があります)。

これが理にかなっていることを願っています。

于 2009-03-13T05:34:22.297 に答える
0

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

Windows で自分で条件変数を作成する方法については、以下のリンクを参照してください: http://www.cs.wustl.edu/~schmidt/win32-cv-1.html

Windows Vista を使用している場合は、次の msdn の例が役立つ場合があります: http://msdn.microsoft.com/en-us/library/ms686903(VS.85).aspx

いずれの場合も、Schmidt の Web サイトに示されているロジックを使用すると、より移植性が高いように見えます (少なくとも、さまざまなバージョンの Windows で移植可能です)。Schmidt の実装は、ほとんどの最新の UNIX/LINUX システムで広く使用されている標準である標準の POSIX API の感覚を提供します。

于 2009-03-13T07:07:13.133 に答える