互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的。

互斥量相对于临界区更为高级,可以对互斥量进行命名,支持跨进程的线程同步。互斥量是调用的Win32的API对互斥锁的操作,因此在同一操作系统下不同进程可以按照互斥锁的名称共享锁。

正因为如此,互斥锁的操作会更好资源,性能上相对于临界区也有降低,在使用时还要多斟酌。对于进程内的线程同步使用临界区性能会更佳。

在.Net中使用Mutex类来表示互斥量,使用实例的WaitOne()阻止线程执行至到获取Mutex对象,ReleaseMutex()释放锁资源,我们来看一下示例

class MutexTest
    {
        //创建Mutex对象
        private static Mutex mutex = new Mutex(true, "My");
        //
        static void Main(string[] args)
        {
            Run();
            Console.ReadLine();
        }
        //模拟多线程调用
        public static void Run()
        {
            const int count = 2;
            var threads = new Thread[count];
            for (var i = 0; i < count; i++)
            {
                var ts = new ThreadStart(UserResource);
                var t = new Thread(ts);
                t.Name = "thread" + (i + 1);
                threads[i] = t;
            }
            foreach (var t in threads)
            {
                t.Start();
            }
            //
            Console.WriteLine(string.Format("Creating thread {0} owns the Mutex.", Thread.CurrentThread.Name));
            Thread.Sleep(1000);
            mutex.ReleaseMutex();
            Console.WriteLine(string.Format("Creating thread {0} releases the Mutex.", Thread.CurrentThread.Name));
        }
        //修改共享资源值
        public static void UserResource()
        {
            mutex.WaitOne();
            Console.WriteLine(string.Format("Child thread named {0} owns the mutex.", Thread.CurrentThread.Name));
            Thread.Sleep(1000);
            mutex.ReleaseMutex();
            Console.WriteLine(string.Format("Child thread named {0} releases the mutex.", Thread.CurrentThread.Name));
        }
    }

Mutex对象是一个全局对象,构造时可以指定name,只要name一样都认为是同一个Mutext。另外再构造时指定的第一个Bool参数表示创建Mutex对象的线程是否拥有该互斥量。

如果是True表示拥有,必须要释放后才可以被其它线程使用。上述代码示例中就需要主线程释放Mutex。

首先由主线程创建一个Mutex对象,并拥有该Mutex对象

然后主线程接着执行,创建2个线程,线程内部使用WaitOne来阻止该线程继续执行,直到接收到Mutex对象释放的信号,方能获得Mutex使用权,继续执行。

Sleep 1秒之后,主线程释放Mutex对象

子线程WaitOne获得释放信号并抢占Mutex拥有权,获得者将进入执行资源代码,而另外的子现在要等到ReleaseMutex之后才能获得Mutex拥有权。

在使用Mutex时WaitOne用来阻止线程的执行,直到获取到Mutex对象的拥有权。也可以指定阻止时间,超时获取Mutex拥有权失败,会继续执行后续代码,执行完毕无需释放Mutex。

WaitOne要和ReleaseMutex成对使用,获取锁对象后要记得释放,否则会造成其它线程一直等待状态。

线程同步方式之互斥量Mutex的更多相关文章

  1. Linux的线程同步对象:互斥量Mutex,读写锁,条件变量

        进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...

  2. Linux/Unix 线程同步技术之互斥量(1)

    众所周知,互斥量(mutex)是同步线程对共享资源访问的技术,用来防止下面这种情况:线程A试图访问某个共享资源时,线程B正在对其进行修改,从而造成资源状态不一致.与之相关的一个术语临界区(critic ...

  3. c# Thread5——线程同步之基本原子操作。Mutex互斥量的使用

    之前的博文也说到了如果多线程对于访问的公共资源操作都是原子操作,那么可以避免竞争条件.关于多线程的竞争可以百度. 1.执行最基本的原子操作 c#提供了一系列供我们使用的原子操作的方法和类型,比如我们的 ...

  4. 经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  5. (转)经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  6. 多线程面试题系列(7):经典线程同步 互斥量Mutex

    前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似, ...

  7. 秒杀多线程第七篇 经典线程同步 互斥量Mutex

    本文转载于:http://blog.csdn.net/morewindows/article/details/7470936 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用 ...

  8. 转--- 秒杀多线程第七篇 经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  9. [一个经典的多线程同步问题]解决方案三:互斥量Mutex

    本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...

随机推荐

  1. WebApi实现单个文件的上传下载

    上传和下载是很常用的功能了,只有当用到的时候才发现不会写...,经过一番百度.筛选.整理修改后,实现了功能,下面简单的记录下实现方法. 一.上传功能 1.前端代码 上传文件 <input typ ...

  2. 34.Linux-printk分析、使用__FILE__, __FUNCTION__, __LINE__ 调试

    本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表 ...

  3. 乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  4. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  5. Java虚拟机--线程安全和锁优化

    Java虚拟机--线程安全和锁优化 线程安全 线程安全:当多线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象 ...

  6. 【Java并发编程】8、各种锁的概念

    持续更新中... 共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,直到已释放所有共享锁.获准共享锁的事务只能读数据,不能修改数据. 排他锁(X锁):如果事务 ...

  7. vue 教程

    1.安装 nodejs,检测 nodejs 环境(node -v). 2.安装vue-cli脚手架npm install vue-cli -g 3.在电脑的某个盘中创建项目,之后进入该项目. 4.初始 ...

  8. Connect the Cities(hdu3371)并查集(附测试数据)

    Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. Java - TreeSet源码解析

    Java提高篇(二八)------TreeSet 与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap& ...

  10. HDU1045(KB10-A 二分图最大匹配)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...