关于Interlocked.CompareExchange做同步的问题

    xiaoxiao2022-12-09  69

    关于此函数的同步问题,做一个小例子,以备工作参考,注意static 这个关键字的含义,就此例子而言,加与不加都是可以同步成功的,但是对于有些应用,不加是不对的,比如同时只允许一个线程读取的主从问题场景的应用(类似Modbus主从站问题)。

    添加一个函数同步的特性,曾经看到了一次,记不住在哪个命名空间,备注一下!

     [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;

    namespace ConsoleApp12 {     public class Instance     {         public int sum = 0;         public static int sync = 0;         private SpinWait wait = new SpinWait();         public void GetSum(int total)         {                          while (true)             {                 if (Interlocked.CompareExchange(ref sync, 1, 0) == 0)                 {                     Console.WriteLine(DateTime.Now.ToString("yyyy MM dd HH ss mm fff"));                     sum = 0;                     for (int i = 1; i <= total; i++)                     {                         sum += i;                     }                     Console.WriteLine(sum);                     Console.WriteLine(DateTime.Now.ToString("yyyy MM dd HH ss mm fff"));                     Interlocked.CompareExchange(ref sync, 0, 1);                     break;                 }                 else                 {                     wait.SpinOnce();                 }             }          }     }     class Program     {         static void Main(string[] args)         {             Instance instance = new Instance();             Instance instance2 = new Instance();

                Task.Factory.StartNew((a) =>             {

                    Instance obj = a as Instance;                 obj.GetSum(1000000);

                }, instance);

                Task.Factory.StartNew((a) =>             {

                    Instance obj = a as Instance;                 obj.GetSum(1000000);

                }, instance);

                Task.Factory.StartNew((a) =>             {

                    Instance obj = a as Instance;                 obj.GetSum(1000000);

                }, instance2);

                Task.Factory.StartNew((a) =>             {

                    Instance obj = a as Instance;                 obj.GetSum(1000000);

                }, instance2);

                Console.ReadKey();         }     } }  

    最新回复(0)