关于Interlocked.CompareExchange做同步的问题

关于此函数的同步问题,做一个小例子,以备工作参考,注意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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值