基元线程同步——Interlocked Anything模式

上一篇基元线程同步——基础,非阻塞同步(VolatileRead,VolatileWrite,volatile,Interlocked) 已经对Interlocked类做了比较详细的分析,这一篇是对Interlocked类的一个模式进行补充说明。如果没用过Interlocked类,可以看看上面的这篇文章。

这个模式的名字是Jeffrey给起的,它究竟要解决什么问题,我们为什么要用它?带着这些疑问,我们来看看它的应用场景。

看看下面这个设定最大值的例子:

        private static Int32 Maximum(ref int target, int value)
        {
            int oldValue;
            oldValue = target;

            //计算最大值
            int temp = Math.Max(target, value);

            //注意:这里可能有其他线程恰好修改了target的值

            //如果target是oldValue,则替换成最大的值
            Interlocked.CompareExchange(ref target, temp, oldValue);

            return target;
        }

测试代码:

            int v1 = 10;

            v1 = Maximum(ref v1, 20);
            Console.WriteLine("v1:" + v1);

如果恰好有一个线程在Interlocked.CompareExchange这句代码执行前修改了target的值为15,那么我们这里的最大值20就不会生效,因为CompareExchange的比较条件将会失败。我们得到的输出,有可能是:v1:15。

这样的结果可能不是我们的预期,问题在于上面的代码只调用了CompareExchange一次,如果不成功就跳过了这次修改。所以,我们可以考虑对CompareExchange做一个循环判断,不成功就再度尝试修改,直到成功为止。而这正是Jeffery所说的Interlock Anything模式。

我们进一步修改上面的代码:

        private static Int32 Maximum(ref int target, int value)
        {
            int oldValue, currentValue;

            currentValue = target;
            do
            {
                //oldValue记录当前循环开始时的原始值
                oldValue = currentValue;

                //计算最大值
                int temp = Math.Max(target, value);

                //注意:这里可能有其他线程恰好修改了target的值

                //如果target是oldValue,则替换成最大的值。
                //如果被其他线程修改了,currentValue返回的将会是被其他线程修改后的最新值,比如:15
                currentValue = Interlocked.CompareExchange(ref target, temp, oldValue);
            }
            while (currentValue != oldValue);//如果被修该,则进入下一次循环,尝试再次修改

            return target;
        }

注释中已经写得很清楚了,可能你需要反复的思考一下上面的代码,理解其意图。这里只是对Int32的值进行了修改,利用这个模式实际可以对任何引用类型的值进行修改。从而避免多线程访问共同变量带来的冲突。

对于这个模式的应用,我们看看微软给我们的示范:在实现事件(Event)时是如何运用了这个模式的。

首先定义下面的一个事件:

        public delegate bool UploadFileCompleteEventHander(string fileName);
        public event UploadFileCompleteEventHander UploadFileComplete;

我们知道,事件本身还是用代理来实现的,只不过编译器帮我们做了这部分工作,反编译这个事件的代码:

public event UploadFileCompleteEventHander UploadFileComplete
{
    add
    {
        UploadFileCompleteEventHander hander2;
        UploadFileCompleteEventHander uploadFileComplete = this.UploadFileComplete;
        do
        {
            hander2 = uploadFileComplete;
            UploadFileCompleteEventHander hander3 = (UploadFileCompleteEventHander) Delegate.Combine(hander2, value);
            uploadFileComplete = Interlocked.CompareExchange<UploadFileCompleteEventHander>(ref this.UploadFileComplete, hander3, hander2);
        }
        while (uploadFileComplete != hander2);
    }
    remove
    {
        UploadFileCompleteEventHander hander2;
        UploadFileCompleteEventHander uploadFileComplete = this.UploadFileComplete;
        do
        {
            hander2 = uploadFileComplete;
            UploadFileCompleteEventHander hander3 = (UploadFileCompleteEventHander) Delegate.Remove(hander2, value);
            uploadFileComplete = Interlocked.CompareExchange<UploadFileCompleteEventHander>(ref this.UploadFileComplete, hander3, hander2);
        }
        while (uploadFileComplete != hander2);
    }
}

看见了吗,上面的add和Remove方法,对代理的添加和删除就是用的这个模式,多么经典。保证多个线程注册一个事件时,不会出现冲突。

总结:

1,一个变量可能被多线程访问时,可以考虑运用这个模式。

2,它的速度比阻塞式同步,如lock等,要快很多。

3,它能对任何类型的变量进行赋值,而不仅仅局限于Int32,等原子操作类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值