0

ParallelForネストされたループを実行しているメソッドを持つクラスがあります。基本的に、オブジェクトのリストを繰り返し処理してから、各オブジェクトのプロパティに含まれるリストを繰り返し処理します。

内側のループ内のオブジェクトごとに計算された条件に基づいて、キューに追加したいと思います。キューに追加するときに同時実行性を維持しようとして、「syncRoot」オブジェクトを使用しています。

public class ParallelTest
{
    private static object syncRoot = new object();

    public void Test() {
       List<MyLog> queue = new List<MyLog>();
       ...
       Parallel.For(0, set.Count(), delegate(int i)
       {
           var obj = set[i];
           List<Connection> conns = obj.GetConnections();
           ...      
           Parallel.For(0, conns.Count(), delegate(int j)
           {    
               Connection c = conns[j];
               MyLog log = new MyLog();             
               ...                  
               if (condition)
               {                    
                   lock (syncRoot)
                   {
                       queue.Add(log);
                   }
               }
           }
       }

       Debug.WriteLine(queue.Count);
   }
}

私が抱えている問題は、すべてのオブジェクトがキューに追加されていないように見えることです。私は200個のオブジェクトのセットをテストし、をに置き換えているconditionので、200trueになると予想queue.Countします。しかし、奇妙な結果が得られます...時には200、時には198または199。

私はここで何が間違っているのですか?各スレッドが確実に考慮されるようにするにはどうすればよいですか?

4

2 に答える 2

1

これはLinqの優れた候補のようです。

で表されるコード...を署名付きのメソッドにカプセル化できると仮定します。

void Initialize(MyLog log, Connection conn, SomeUnknownType obj)

コードは次のlinqステートメントに還元される可能性があります。

    var logs = set  
        .AsParallel()
        .SelectMany(
            obj =>
                obj.GetConnections()
                    .Select(conn => new{obj, conn}))
        .Select(x => { 
            var o = new{x.obj, x.conn, log = new MyLog()};
            Initialize(o.log, o.conn, o.obj); //or just do work inline
            return o;
        })
        .Where(x => x.obj... && x.conn...) //someCondition

    queue = logs.ToList();

比較的高いと見なすとset.Count()、並列set化することで、使用可能なコア間で作業が適切に分割されるようになります。後で再度並列化する必要はありません。

于 2012-10-29T16:37:45.037 に答える
0

ConcurrentQueue<T> Class代わりに使用できますList<T>http://msdn.microsoft.com/en-us/library/dd267265.aspxを参照してください

詳細については。

于 2012-10-29T16:27:19.617 に答える