c# - 如果用不同数量的线程并行调用,为什么会得到不同的总和?

标签 c# multithreading

这只是我提出的以下问题的延伸:

Why can't I reach 100% CPU utilization with my parallel tasks code?

 private static int SumParallel()
        {
            var intList = Enumerable.Range(1, 1000_000_000);
            int count = intList.Count();
            int threads = 6;
            List<Task<int>> l = new List<Task<int>>(threads);
            for(int i = 1; i <= threads; i++)
            {
                int skip = ((i - 1) * count) / threads;
                int take = count / threads;
                l.Add(GetSum(intList, skip, take));
            }
            Task.WaitAll(l.ToArray());
            return l.Sum(t => t.Result);
        }

private static Task<int> GetSum(IEnumerable<int> list, int skip, int take)
        {
            return Task.Run(() =>
             {
                 int temp = 0;
                 foreach(int n in list.Skip(skip).Take(take))
                 {
                     if (n % 2 == 0)
                         temp -= n;
                     else
                     {
                         temp += n;
                     }
                 }

                 Console.WriteLine(temp + " " + Task.CurrentId);
                 return temp;
             });
        }

如果修改并行工作的任务数,则会得到不同的总和。

为什么会这样呢?

最佳答案

因为这条线:

int skip = ((i - 1) * count) / threads;
int take = count / threads;

考虑threads = 3count = 10它不能涵盖您的所有列表。根据线程数,您在takeskip中会得到不同的舍入,有时它们不能覆盖列表中的所有项。

您也许应该这样更改它:
for(int i = 1; i <= threads; i++)
{
    int skip = ((i - 1) * count) / threads;
    int take = count / threads;

    if(i == threads)
        take = threads - skip;

    l.Add(GetSum(intList, skip, take));
}

关于c# - 如果用不同数量的线程并行调用,为什么会得到不同的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62100278/

相关文章:

c# - 如何使用带有wp7的GPS获取地址名称

c# - 从 C# 调用 C++ dll 函数时出现问题

java - 将 Netty channel 传递到队列并稍后将其用于不同线程上的写入是否有效?

用于第 3 方库调用的 C++ 看门狗

c# - 如何将 dropshadoweffect 添加到文本框的文本(以编程方式)

c# - 带有 SQLdataSource 的大型分页 GridView、Rollup 和 Grand Totals

multithreading - 什么是竞争条件?

c - 如何控制具有多个互斥锁和条件的线程?

c# - 在字符串中的连续数字后面插入字符串?

python - 如何终止在Python中调用Web浏览器的线程