6

バイト配列があるとしますPrivate Data as Byte()。この配列はクラス内でプライベートです。このクラスは、への読み取りと書き込みのためのパブリック関数を提供しますData

このクラスには複数のスレッドからアクセスできるので、このクラスからの読み取りと書き込みが同時に行われない状況を避けたいと思います。

今のところ、問題を回避するためにSyncLockを使用しています。書き込み関数だけを入れることはできますかSyncLock Data、それとも読み取り関数に入れる必要がありますか?または両方?

特定のコード例は考えていません。書き込み関数のSyncLockによって書き込みがそもそも排他的にアクセスできるようになる場合、読み取り関数と書き込み関数の両方をロックすることに利点があるかどうかだけが気になります。

4

2 に答える 2

5

SyncLockを使用する代わりに、ReaderWriterLockSlim(または、.NET 4を使用していない場合はReaderWriterLock )の使用を検討する必要があります。

これは、単一のライターを許可することを目的としていますが、複数のリーダーを許可します。これは通常、説明しているような状況に最適です。

それ以外の場合は、SyncLockを使用できますが、読み取り操作と書き込み操作の両方をロックする必要があります。両方をロックしないと、ライターが書き込みを行っている間にリーダーがデータを読み取る可能性があります。これにより、ハーフセットデータを読み取ることができます。

于 2011-01-07T01:25:32.623 に答える
4

バイト配列の読み取りをロックしたい主な理由は、「ファントム読み取り」またはその他の繰り返し不可能な読み取りを回避するためです。ライターが配列の更新の途中である場合、リーダーには古い値と新しい値が表示されることがあります。 、または古い値と、それを再度読み取る場合は新しい値。

たとえば、[1、2、3、4、5、6]を含む配列があり、各要素に1を追加して配列をループするライタースレッドがある場合、次のような奇妙さSyncLockを認識しないリーダーが表示される可能性があります。 SyncLock[2、3、4、4、5、6]-実際に取るスレッドのみがSyncLock安全を受け取ります。

于 2011-01-07T01:20:31.313 に答える