0

.NETキューオブジェクトがあります。プロデューサースレッドはエンキュー操作を実行し、キューにエンキューされたデータはbyte []配列であり、他のコンシューマースレッドは同じキューオブジェクトに対してデキュー操作を実行します。

並行性を処理するためにロックを使用します。私のコードはいつもうまく機能しているようですが、昨日、奇妙なことが起こりました。コンシューマースレッドから取得したデータは、生成したデータとは異なります。配列の長さが間違っている、配列が繰り返されています...これはスレッドセーフ保護の失敗が原因ですか?

私の意見では、並行性はデータの損失を引き起こすだけです。

ここでの私の最初の投稿は、我慢してください。

4

2 に答える 2

0

単純なデータ損失よりもはるかに悪いです。Queueクラスは、増え続ける要素に対応するために必要なときに、内部バッファーを再割り当てできます。不適切なロックは、ヘッドインデックスとテールインデックスの古い値で新しいバッファにアクセスする可能性があります。運が良ければ例外が発生するだけです。おそらく、間違った要素を取得するだけです。

于 2010-01-14T12:42:01.820 に答える
0

プロデューサースレッドは、配列への参照を保持して、キューに入れられた後に配列を変更するべきではありません。常に新しいアレイを作成してください。(私は明白なことを述べているかもしれませんが、より多くの情報なしでより良くするのは難しいです)

于 2010-01-14T11:22:42.503 に答える