using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Program
{
class Program
{
static long total = 0;
static long count(int row)
{
/* do_something .. every operation is thread safe here */
return somevalue;
}
static void Main(string[] args)
{
Parallel.For(0, 10000000, i => //some big limit to test threading is working
{
total += count(i);
// however, collecting 'somevalue' from 'count()' operation isn't thread safe.
});
Console.WriteLine(total);
}
}
}
我想并行化上面的代码。我必须在0到10 ^ 9之间进行10次count()
的操作.1。count()
函数本身不与其他线程共享数据。但是,将count()
到total
的结果相加并不是线程安全的 - 每次运行程序时结果都不同。 total
必须存储一些无法存储在int中的整数值。我的问题有解决办法吗?
答案 0 :(得分:3)
这是使用Sum(ParallelQuery<Int64>)
组合投影和求和的单行。
long total = ParallelEnumerable.Range(0, 10000000).Sum(row => count(row));
答案 1 :(得分:2)
并行LINQ使这很容易:
ParallelEnumerable.Range(0, 10000000).Select(i=>count(i)).Sum()
答案 2 :(得分:0)