0

私の最初の考えは、私がテストしたときにここでロックが機能するSpinLockかどうかについてでしConcurrent Collections たが、それはより高価です!

ここでのプロセスは、並列プログラミングに基づいています。そして、タスクは複数の並列で実行されています。

SpinLockバージョン中に、に似たとランダムに言うエラーが発生することがあります"Index out of range"

私が書いたSpinLockバージョンは、私が望んでいた仕事をすることができません。それを機能させるために何か変更を加えることはできますか?または、このケースに正確に関連するように構築されていませんか?

何か情報はありますか?

より良い代替手段はありますか?

これは私がしたことです:

     lock (lckRelatz)
     {
         relatz.Add(st);
     }

そしてここにSpinLockバージョンがあります-これは並行して実行されているメソッドの中にあります:

        SpinLock spinLk = new SpinLock();
        bool gotLock = false;
        try
        {
            spinLk.Enter(ref gotLock);
            relatz.Add(st);
        }
        finally
        {
            if (gotLock)
                spinLk.Exit();
        }
4

1 に答える 1

2

SpinLockスレッドごとに新しいものを作成しているようです。それは実際には何もロックしません。SpinLock1つ持っていて、すべてのスレッドからそれを使用する必要があります。

ただし、同時収集を使用することはさらに優れたソリューションです。それらは高度に最適化されており、それらを使用することで、すべてのロックについて自分で心配する必要がなくなります。

于 2012-07-11T08:01:25.533 に答える