0

私はマルチスレッドのプログラミングに慣れていないので、誰かが私を助けてくれるかどうか疑問に思っています。

シリアル(および連続)非同期メッセージを受信するプログラムを作成し、それを読んでこのメッセージを整理する必要があります。

私はマルチスレッド戦術を使おうとしています。最初のスレッドはシリアル情報を受け取り、それを一度に1行ずつマトリックス(RxTh [col] [row])に書き込む責任があります。次に、2番目のスレッドが呼び出され、RxThマトリックスの各行が読み取られ、特定の文字('begin line' msgを表す)が検索されます。このスレッドは、この受信メッセージを別のマトリックス(Msg [col2] [row2])に配置して、新しいマトリックスの異なる行にあるメッセージの各行を分離する必要もあります。

将来的には、この再配置された行を操作して、詳細情報を検索する必要がありますが、現時点ではこの部分については考えていません。

だから、私はこのプログラムでいくつかの問題を抱えています:

  • まず、読み取り部分を開始するために書き込みを停止したときに、シリアルメッセージの一部が失われています。そのため、ミューテックス、つまりクリティカルセクションを使用しようとしました。しかし、それは機能していません、そして私は理由がわかりません。

  • 2番目の問題は、2番目のマトリックス(Msg [] [])の一部の行の途中に「0」の奇妙なシーケンスがあることです。このスレッドが新しい行を読み取り始めるときに、この「0」が表示されるのではないかと思われます。 RxThマトリックスの。意味がありますか?

  • ミューテックスを使用する場合、一度に1行だけをロックできますか?

誰かが私を助けてくれたら、私は大いに感謝します!

さらに詳しい情報やコードが必要な場合は、私に聞いてください。

ありがとう

4

1 に答える 1

0

本当に必要なのは、バッファーのキューです。あなたのマトリックスはこれを複製しているだけですが、混乱を招き、メタデータ (データに関するデータ) を持っていません。

1) バッファを含むクラスまたは構造体を定義し、このバッファの内容に関する情報 (どのくらいのデータが書き込まれたかなど) を定義します。お気に入り:

class Buff
{
    char contents[1024]; //(this represents your row)
    int numWritten;
    ...
}

2) クリティカル セクションによって保護された FIFO キューを作成します。

現在、Thread1 はnewバッファーを作成し、それを埋めてクリティカル セクションを取得し、バッファーをキューの最後にプッシュして、クリティカル セクションを解放します。

スレッド 2 はクリティカル セクションを取得し、最初のバッファーをキューから取り出し、クリティカル セクションを解放します。バッファの処理が完了したら、それを削除します。

追加の同期が必要になるため、処理するフル バッファがなくなった場合にスレッド 2 を待機させることができます。また、いっぱいになったバッファーの数が多すぎる場合、スレッド 1 は一時停止して、スレッド 2 により多くの時間を与える必要があります。

バッファーの作成と削除が最適でないと思われる場合は、バッファー マネージャーを作成してください。定義済みの数のバッファー (列数) を保持します。スレッド 1 は代わりにそのプールからバッファーを取得し、スレッド 2 は代わりにnewそれらをプールに返しますdelete

バッファーごとに個別のミューテックスを作成すると、一度に 1 つのバッファーを簡単にロックできます。ただし、1 つのスレッドのみが送信し、1 つのスレッドが受信する状況では必要ありません。

于 2012-05-25T12:48:26.560 に答える