スレッド安全ではない.NETキューオブジェクトに何が起こるのでしょうか?

StackOverflow https://stackoverflow.com/questions/2063648

質問

私は、.NETキューオブジェクトを持っています。プロデューサスレッド他の消費者スレッドが同じキューオブジェクトでデキュー動作を実行しながら、エンキュー操作を行い、キューにエンキューされたデータは、バイト[]配列である。

私は、並行性を処理するためにロックを使用しています。私のコードは、すべての時間を正常に動作するようだが、昨日、奇妙な事が起こりました。私は消費者のスレッドから得たデータは、私が生成されたデータは異なっていた:配列の長さが間違っている、繰り返し配列...これは失敗したスレッドセーフ保護に起因していますか?

私の意見では、並行処理は、データの損失を引き起こすます。

ここでの私の最初の記事は、私と一緒に負担します。

役に立ちましたか?

解決

これは、単純なデータの損失よりもはるかに悪いです。要素の増加に対応するために必要なときにキュークラスは、その内部バッファを再割り当てすることができます。不適切なロックは、頭と尾指標の古い値と新しいバッファにアクセスすることができます。運がよけれときだけあなたは、単に間違った要素を得ることである可能性が高い、例外を取得します。

他のヒント

生産者スレッドは、配列への参照を保持し、それがエンキューだ後にそれを変更すべきではありません。常に新しい配列を作成します。 (私は明白なことを述べるかもしれないが、それはより多くの情報なしで良い結果を出すことは困難です)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top