zoukankan      html  css  js  c++  java
  • 关于Parallel.ForEach的不解,请高人指点

    刚看CLR VIA C# 关于 Parallel.ForEach讲解,依葫芦画瓢自己写了一个实例,功能实现了 ,但是不明白如何实现,看源码 看的一头雾水,求高人分析,能帮忙写个简单的内部实现过程

    废话不多说  直接上代码

    //通过for实现运算
     private static long GetTotalCount(String[] strs)
     {
         long totalCount = 0;
        for (int i = 0; i < strs.Length; i++)
         {
              //假设操作耗时
                Thread.Sleep(50);
                 totalCount += strs[i].Length;
           }
                return totalCount;
     }
     1 //通过Parallel.ForEach来实现运算
     2  private static long GetParallelTotalCount(String[] strs)
     3 {
     4       long totalCount = 0;
     5       Parallel.ForEach<string, long>(strs, () => 0, (str, loopState, index, length) =>
     6            {
     7                  //假设操作耗时
     8                   Thread.Sleep(50);
     9                    return str.Length + length;
    10             },
    11                length => Interlocked.Add(ref totalCount, length));
    12 
    13        return totalCount;
    14 }    

    调用过程

     1 private static void Main(string[] args)
     2         {
     3             string[] strs = new[] {"3243","544","5445","dfg","dfgd","hghhhg"};
     4 
     5             List<string> list = new List<string>();
     6             list.AddRange(strs);
     7             list.AddRange(strs);
     8             list.AddRange(strs);
     9             list.AddRange(strs);
    10             list.AddRange(strs);
    11             list.AddRange(strs);
    12             list.AddRange(strs);
    13             list.AddRange(strs);
    14             list.AddRange(strs);
    15             list.AddRange(strs);
    16             list.AddRange(strs);
    17             list.AddRange(strs);
    18             list.AddRange(strs);
    19             list.AddRange(strs);
    20             list.AddRange(strs);
    21             list.AddRange(strs);
    22             list.AddRange(strs);
    23             list.AddRange(strs);
    24             list.AddRange(strs);
    25             list.AddRange(strs);
    26 
    27             string[] strTemp = list.ToArray();
    28 
    29             Console.WriteLine("Parallel Start");
    30             Stopwatch watch = new Stopwatch();
    31             watch.Start();
    32             long totalLength =GetParallelTotalCount(strTemp);
    33             watch.Stop();
    34             Console.WriteLine("TotalCount:{0},Time:{1}", totalLength, watch.ElapsedMilliseconds);
    35             Console.WriteLine("Parallel End");
    36             Console.WriteLine("For Start");
    37             watch.Restart();
    38             totalLength = GetTotalCount(strTemp);
    39             watch.Stop();
    40             Console.WriteLine("TotalCount:{0},Time:{1}", totalLength, watch.ElapsedMilliseconds);
    41             Console.WriteLine("For End");
    42             Console.Read();
    43         }

    得到效果:

     求不吝赐教Parallel.ForEach怎么实现的,代码中  通过Parallel.ForEach来实现运算 中 ,在ForEach终结委托里他是对长度进行了相加,为什么在主体委托中是 return str.Length + length;而不是return length;对立面如何实现不了解

    独木提示下,对代码进行了点修改

     1 //通过Parallel.ForEach来实现运算
     2  private static long GetParallelTotalCount(String[] strs)
     3 {
     4      long totalCount = 0;
     5       Parallel.ForEach<string, long>(strs, () => 0, (str, loopState, index, length) =>
     6       {
     7             //假设操作耗时
     8                                                           Console.WriteLine("ThreadId:{0},CurrentLength;{1},LastLength:{2}", Thread.CurrentThread.ManagedThreadId, str.Length, length);
     9             Thread.Sleep(50);
    10             return str.Length + length;},
    11             length => Interlocked.Add(ref totalCount, length));
    12       return totalCount;
    13 }

    得到效果:

    得出的结论也正如我图片上提到的,一些线程得到的数据看上去是数值的累加,其他一些线程驳斥了这一点。还是不太明白,最主要技术不到家,看源码看不懂

  • 相关阅读:
    【BZOJ3784】树上的路径 点分治序+ST表
    【BZOJ3698】XWW的难题 有上下界的最大流
    【BZOJ2006】[NOI2010]超级钢琴 ST表+堆
    【BZOJ4016】[FJOI2014]最短路径树问题 最短路径树+点分治
    【BZOJ2724】[Violet 6]蒲公英 分块+二分
    【BZOJ3697】采药人的路径 点分治
    【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
    【BZOJ3510】首都 LCT维护子树信息+启发式合并
    Python Web学习笔记之socket编程
    Python Web学习笔记之socket套接字
  • 原文地址:https://www.cnblogs.com/sjr10/p/Parallel_ForEach.html
Copyright © 2011-2022 走看看