3

実行時にオブジェクトを格納するために ConcurrentBag を使用しています。ある時点で、バッグを空にして、バッグの内容をリストに保存する必要があります。これが私がすることです:

        IList<T> list = new List<T>();

        lock (bag)
        {
            T pixel;

            while (bag.TryTake(out pixel))
            {
                list.Add(pixel);
            }
        }

私の質問は同期です。ブックロックを読む限り、他の同期方法よりも高速です。ソース - http://www.albahari.com/threading/part2.aspx .

パフォーマンスは私の 2 番目の関心事です。この時点で ReaderWriterLockSlim を使用できるかどうかを知りたいです。ReaderWriterLockSlim を使用する利点は何ですか? その理由は、この操作で受信リクエストをブロックしたくないからです。

はいの場合、アップグレード可能なロックを使用する必要がありますか?

何か案は ?コメント?

4

2 に答える 2

5

なぜロックを使用しているのかわかりません。背後にある全体的な考え方ConcurrentBagは、それが並行であるということです。

バッグを空にしているときに、他のスレッドがバッグに物を入れたり、バッグに物を追加したりするのを防ごうとしている場合を除きます。

あなたの質問を読み直してください、私はあなたがここでアクセスを全く同期させたくないと確信しています。明示的な同期を行うことなく、とConcurrentBagへの複数のスレッドを許可します。TakeAdd

バッグをロックすると、コードの実行中に他のスレッドが追加または削除できなくなります。もちろん、バッグへの他のすべてのアクセスをロックで保護すると仮定します。これを行うと、ロックフリーの同時データ構造を持つという目的が完全に無効になります。データ構造が、ロックによって制御されるパフォーマンスの低いリストになっています。

リーダーライターロックを使用する場合も同じです。すべてのアクセスを同期する必要があります。

この場合、明示的な同期を追加する必要はありません。ロックを捨てる。

于 2011-09-30T17:58:30.453 に答える
1

ロックは、スレッドが連続して多くの操作を実行する場合に最適です (バースト - 低競合)。

RWSlim は、書き込みロックよりも読み取りロックの方が多い場合に最適です (読み取りが重い - 読み取り競合が多い)。

ロックレスは、複数のリーダーやライターがすべて同時に動作する必要がある場合に最適です (読み取り/書き込みの混合 - 多くの競合)。

于 2011-09-30T21:05:15.383 に答える