如何为我的代码提供线程安全性?

时间:2013-01-17 18:59:22

标签: c# multithreading

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中的整数值。我的问题有解决办法吗?

3 个答案:

答案 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)