代码 class Program
    {
        public static Model m;
        static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch stop = new System.Diagnostics.Stopwatch();
            ThreadStart ts = new ThreadStart(js);
            ThreadStart ts2 = new ThreadStart(js);
            Thread t1 = new Thread(ts);
            Thread t2 = new Thread(ts2);
            stop.Reset();
            m = new Model();
            m.i = 0;
            m.sum = 0;
            stop.Start();
            js();
            stop.Stop();
            Console.WriteLine(stop.ElapsedMilliseconds);
            Console.WriteLine(m.sum);            stop.Reset();
            m.i = 0;
            m.sum = 0; ;
            stop.Start();
            t1.Start();
            t2.Start();
            stop.Stop();
            Console.WriteLine(stop.ElapsedMilliseconds);
            Console.WriteLine(m.sum);
            Console.ReadKey();
        }        static void js()
        {
            lock (m)
            {
                for (; m.i <= 1000000000; m.i++)
                {
                    m.sum += m.i;
                }
            }
        }
    }
    class Model
    {
        public int i = 0;
        public long sum = 0;
    }结果
多线程求和出现错误的结果,我认为i是值类型 无法lock操作,导致可能相同i多次相加。所以用Model类来存储i跟sum,依旧出现错误结果。是lock这个操作没起到作用,还是其他原因。这种累加方式能否用一个方法且多线程能否实现?

解决方案 »

  1.   

    用system.threading.interlock下的原子操作方法实现
      

  2.   


            static void js()
            {
                lock (LockObj)
                {
                    for (; n < 100000; n++)
                    {
                        m += n;
                    }
                }
            }
            public static object LockObj = new object();
            public static int m = 0, n;
            static void Main(string[] args)
            {
                System.Diagnostics.Stopwatch stop = new System.Diagnostics.Stopwatch();
                Console.WriteLine("单线程操作:");
                stop.Start();
                js();
                stop.Stop();
                Console.WriteLine("用时:" + stop.ElapsedMilliseconds);
                Console.WriteLine("值:" + m);            stop.Reset();
                m = n = 0;
                Console.WriteLine("\n\n\n\n多线程操作:");
                stop.Start();
                Thread t1 = new Thread(js);
                Thread t2 = new Thread(js);
                t1.Start();
                t2.Start();
                t1.Join();
                t2.Join();
                stop.Stop();
                Console.WriteLine("用时:" + stop.ElapsedMilliseconds);
                Console.WriteLine("值:" + m);
            }
    应该像这个样子,你理解理解看。
      

  3.   

    锁没问题,关键是stop.Start(); 
    t1.Start();
    t2.Start(); 
    stop.Stop();            
    Console.WriteLine(stop.ElapsedMilliseconds);            
    Console.WriteLine(m.sum);            
    Console.ReadKey();t1,t2还没运行完你就输出了m.sum
      

  4.   

    学习线程同步知识
    .net 4.5的:http://msdn.microsoft.com/zh-cn/library/ms173179(v=vs.110).aspx