c#多线程同步1-原子操作

多线程共享全局变量(会发生什么)

        static int sum = 0;
        static void func(object state)
        {
            for (int i = 0; i < 1000000; i++)
            {
                sum += i;
            }
            AutoResetEvent autoEvent = (AutoResetEvent)state;
            autoEvent.Set();  // 向WaitHandle.WaitAll 一个线程执行完毕
        }
        

        static void Main(string[] args)
        {
            int threadCount = 4;
            //分别打印5次 4个线程并行计算sum的值
            for (int index = 0; index < 5; index++)
            {
                WaitHandle[] waitHandle = new WaitHandle[threadCount];
                for (int i = 0; i < threadCount; i++)
                {
                    waitHandle[i] = new AutoResetEvent(false);
                    new Thread(new ParameterizedThreadStart(func)).Start(waitHandle[i]);  //开启线程
                }
                //等待4线程执行结束
                WaitHandle.WaitAll(waitHandle);
                Console.WriteLine($"index={index+1} sum={sum}");
                sum = 0;        //让sum清零
            }
            Console.ReadKey();
        }

interlocked

结论:多个线程同时操作一个变量,计算的结果并不是我们想要的.如何才能高效得出我们想要的结果呢?

使用原子操作(使用很简单)

        static int sum = 0;
        static void func(object state)
        {
            for (int i = 0; i < 1000000; i++)
            {
                //Interlocked.Increment(ref sum);  //以原子操作递增1
                Interlocked.Add(ref sum, 1);       //以原子操作递增指定的值,这里加1
            }
            AutoResetEvent autoEvent = (AutoResetEvent)state;
            autoEvent.Set();  // 向WaitHandle.WaitAll 一个线程执行完毕
        }
        

        static void Main(string[] args)
        {
            int threadCount = 4;
            //分别打印5次 4个线程并行计算sum的值
            for (int index = 0; index < 5; index++)
            {
                WaitHandle[] waitHandle = new WaitHandle[threadCount];
                for (int i = 0; i < threadCount; i++)
                {
                    waitHandle[i] = new AutoResetEvent(false);
                    new Thread(new ParameterizedThreadStart(func)).Start(waitHandle[i]);  //开启线程
                }
                //等待4线程执行结束
                WaitHandle.WaitAll(waitHandle);
                Console.WriteLine($"index={index+1} sum={sum}");
                sum = 0;        //让sum清零
            }
            Console.ReadKey();
        }

       原子操作Interlocked.Add


秋风 2016-12-25