あるスレッドからの書き込みにアクセスする汎用のQueue<T>
(System.Collections.Generic
)があります。また、読み込みのために別のスレッドからアクセスする必要があります。キュー全体をコピーしていますか?<T>演算子「=」スレッドセーフ(C#)
性能上の理由から、プロセス同期(ConcurrentQueue<T>
の使用を含む)を実行したくありません。そこで、キュー全体を同じタイプの別のキューオブジェクトにコピーするアイデアを読んでいました。読み取りスレッドの後続の操作は、コピーで実行されます。コピーは簡単なオペレータ=
で行います。ここで
は、いくつかの擬似コードです:
//Creating main queue
Queue<MyType> queue1 = new Queue<MyType>();
の書き込みスレッド:スレッドを読む
//Perform writing in the main queue
queue1.Enqueue(object);
...
queue1.Dequeue();
:
//Copy main queue
Queue<MyType> queue2 = queue1;
//perform all operations in reading thread on queue2
だから、このようなソリューションのスレッドが安全なのですか?
UPD:ありがとう、私はこれが単にリンクをコピーしていることに気づいていませんでした。スレッドセーフな方法でオブジェクト全体を値でコピーする方法はありますか?
キューを別のスレッドに公開した後にキューを変更しないと、スレッドセーフになります。 – Steven
通常、「キュー」はプロデューサ/コンシューマのシナリオで使用されることを意味します。つまり、1つのスレッドがそれに書き込みを行い、もう1つのスレッドがそこから読み取ります。毎回それをコピーするのはあまり意味がありません(あなたはどんなコレクションタイプも使うことができ、同じように動作します)。単一の共有キューを使用して、単一のアイテムをデキューしている間にまもなくロックするか、以下のような 'ConcurrentQueue'を使用する必要があります。 – Groo