• 技术文章 >后端开发 >C#.Net教程

    详解.NET 同步与异步 之 Mutex

    迷茫迷茫2017-03-26 16:10:26原创1665
    本随笔续接:.NET 同步与异步 之 线程安全的集合 (十一)

    本随笔 及 接下来的两篇随笔,将介绍 .NET 同步与异步系列 的最后一个大块知识点:WaitHandle家族。

    抽象基类:WaitHandle, 三个子类: EventWaitHandle(Event通知) 、Mutex(进程同步锁)、Semaphone (信号量),还有两个孙子辈:System.Threading.AutoResetEvent、System.Threading.ManualResetEvent,都是 EventWaitHandle 的子类。

    一、抽象基类 WaitHandle

    [ComVisibleAttribute(true)]public abstract class WaitHandle : MarshalByRefObject, IDisposable

    通过上面的信息,我们可以知道 WaitHandle 继承自 MarshalByRefObject, 并实现了 IDisposable 接口。

    对于 MarshalByRefObject ,你也许不是很熟悉,但它的很多子类你一定会用过的,让我们来揭开它的庐山真面目。

    在MSND中是这样描述 MarshalByRefObject 的:

    应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象直接通信。不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本,一种是使用代理交换消息。MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。

    看到这里你也许更迷惑了,我用过它? 用过它的子类? 没错,就是用过它的子类,并且还很多。

    例如 System.Drawing命名空间的 Brush、Image、Pen、Font 等等,还有个大家更熟悉的 System.IO命名空间下的Stream.

    延展阅读:利用 MarshalByRefObject 实现 AOP 。

    看到这里我们只需要知道 WaitHandle 具有跨应用程序域进行通讯的能力就可以了。

    二、Mutex(进程同步锁)

    1、MSDN对Mutex的定义为进程间的同步基元, 即锁的概念。

      反观Monitor、平时只用来在应用程序域内的线程之间通信。其实,如果用于锁的对象派生自MarshalByRefObject,Monitor 也可在多个应用程序域中提供锁定。

      Mutex由于需要调用操作系统资源,因此执行的开销比Monitor大得多,所以如果仅仅需要在应用程序内部的线程间同步操作,Monitor/lock应当是首选

    2、Mutex 的用法

    3、全局和局部的Mutex

    如果在一个应用程序域内使用Mutex,当然不如直接使用Monitor/lock更为合适,因为前面已经提到Mutex需要更大的开销而执行较慢。不过Mutex毕竟不是Monitor/lock,它生来应用的场景就应该是用于进程间同步的。用于在进程间通讯的Mutex我们称为全局Mutex,而只用于在应用程序域内部通讯的Mutex、我们称为局部Mutex.

    全局Mutex和局部Mutex是通过构造函数来构造不同的实例的,让我们来看一下Mutex的构造函数,一共有5个,挑两个具有代表性的看一下吧:

    4、用途

    Mutex天生为进程间的同步基元,因此它可以用来控制应用程序的单实例

    /// <summary>/// 单实例运行/// </summary>/// <returns> true 应用程序已启动,false 则没有 
    </returns>public bool SingleRun(ref System.Threading.Mutex mutex )
    {
        mutex = new System.Threading.Mutex(false, "WINDOWS");    
        if (!mutex.WaitOne(0, false))
        {
            mutex.Close();
            mutex = null;
        }    if (mutex == null)
        {        return true;
        }    return false;
    }

    php入门到就业线上直播课:查看学习

    以上就是详解.NET 同步与异步 之 Mutex的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:详解C# 控制台倒计时 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言中源文件编译后生成什么文件• c语言标识符有哪些类型• C#中GDI+编程10个基本技巧二• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 应用绝对路径与相对路径
    1/1

    PHP中文网