C# 并行编程 之 原子操作

概要

当多个任务对一个int 型整数进行自增操作时,(是int简单类型而不是Integer对象),也需要用到同步方法。但如果这时使用Lock,Moniter或SpinLock时总是显得得不偿失。一个自增操作的开销非常小,但此时加锁,等待,解锁操作的开销远远大于一个自增的操作。这时可以考虑使用 Interlocked类,它提供了原子操作。而且需要的代价非常低,简单轻便。

Interlocked提供了一组原子操作的接口,可以提供不同的操作方式

C# 并行编程 之 原子操作_第1张图片

参考: https://msdn.microsoft.com/zh-cn/library/system.threading.interlocked.aspx

代码示例:

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;

namespace Sample5_8_semaphoreslim
{
    class Program
    {
        private static int _TaskNum = 10;
        private static Task[] _Tasks;
        private const int MAX_RESOURCE = 3;
        private const int RUN_LOOP = 10;


        private static int m_Result;

        private static void Work1(int TaskID)
        {
            int i = 0;

            while (i < RUN_LOOP)
            {
                try
                {
                    Interlocked.Increment(ref m_Result);
                    Console.WriteLine("TASK " + TaskID + " WOrking ... ..." + m_Result);
                }
                finally
                {
                    i++;
                }
            }
        }

        static void Main(string[] args)
        {
            _Tasks = new Task[_TaskNum];
            int i = 0;

            for (i = 0; i < _TaskNum; i++)
            {
                _Tasks[i] = Task.Factory.StartNew((num) =>
                {
                    var taskid = (int)num;
                    Work1(taskid);
                }, i);
            }

            var finalTask = Task.Factory.ContinueWhenAll(_Tasks, (tasks) =>
            {
                Task.WaitAll(_Tasks);
                Console.WriteLine("==========================================================");
                Console.WriteLine("All Phase is completed");
                Console.WriteLine("==========================================================");
            });

            try
            {
                finalTask.Wait();
            }
            catch (AggregateException aex)
            {
                Console.WriteLine("Task failed And Canceled" + aex.ToString());
            }
            finally
            {
            }
            Console.ReadLine();
        }
    }
}

你可能感兴趣的:(编程,解锁)