【转载】5天不再惧怕多线程——第三天 互斥体

没想到我的前两篇文章还挺受欢迎的,谢谢大家,今天整理下Mutex的使用。

一:Mutex

首先看下MSDN对它的解释:

不错,出现了一个亮点,可用于“进程间同步“,既然进程间都可以同步,那线程同步对它来说不是小菜一碟吗?好的,还是看下Mutex在

线程中发挥的神奇功效。

1: 线程间同步

Metux中提供了WatiOne和ReleaseMutex来确保只有一个线程来访问共享资源,是不是跟Monitor很类似,下面我还是举个简单的例子,

注意我并没有给Metux取名字。

 1 class Program 2     { 3         static void Main(string[] args) 4         { 5             for (int i = 0; i < 20; i++) 6             { 7                 Thread t = new Thread(Run); 8  9                 t.Start();10             }11 12             Console.Read();13         }14 15         static int count = 0;16 17         static Mutex mutex = new Mutex();18 19         static void Run()20         {21             Thread.Sleep(100);22 23             mutex.WaitOne();24 25             Console.WriteLine("当前数字:{0}", ++count);26 27             mutex.ReleaseMutex();28         }29     }

2:进程间同步

这次我给Mutex取个名字叫cnblogs,把Console程序copy一份,然后看看真的能够实现进程同步吗?

 1  class Program 2     { 3         static void Main(string[] args) 4         { 5             Thread t = new Thread(Run); 6  7             t.Start(); 8  9             Console.Read();10         }11 12         static Mutex mutex = new Mutex(false, "cnblogs");13 14         static void Run()15         {16             mutex.WaitOne();17 18             Console.WriteLine("当前时间:{0}我是线程:{1},我已经进去临界区", DateTime.Now, Thread.CurrentThread.GetHashCode());19 20             //10s21             Thread.Sleep(10000);22 23             Console.WriteLine("\n当前时间:{0}我是线程:{1},我准备退出临界区", DateTime.Now, Thread.CurrentThread.GetHashCode());24 25             mutex.ReleaseMutex();26         }27     }

3:  小结

①:  当给Mutex取名的时候能够实现进程同步,不取名实现线程同步,详细细节参考MSDN:

②: Mutex封装了win32的同步机制,而Monitor是由framework封装,所以在线程同步角度来说,Monitor更加短小精悍,优于Mutex,要是实现进程

同步,Monitor也干不了,所以Mutex是首选。

二:Interlocked

同样先向MSDN讨个说法,看看如何解释。

”原子操作”是个亮点,我们知道“原子”是不可再分的,深一点的意思就是说站在程序员的角度来看是不需要手工干预的,也就是所谓的“无锁编程”。

实际应用中有时候我们可能只是对共享变量进行一些简单的操作,比如说“自增,自减,求和,赋值,比较"。

1:Increment

看看是不是达到了不可再分的自增效果,蛮有意思。

 class Program    {        static void Main(string[] args)        {            for (int i = 0; i < 20; i++)            {                Thread t = new Thread(Run);

t.Start();            }

Console.Read();        }

static int count = 0;

static Mutex mutex = new Mutex();

static void Run()        {            Thread.Sleep(100);

Console.WriteLine("当前数字:{0}", Interlocked.Increment(ref count));        }    }

2:Decrement

这个就不用举例子了。

3:Add

发现MSDN解释的还是蛮详细的。

1      static void Main(string[] args)2         {3             int i = 10;4 5             Interlocked.Add(ref i, 20);6 7             Console.WriteLine(i);  //i=308         }

4:Exchange

这个就是所谓的原子性赋值操作

1  static void Main(string[] args)2         {3             int i = 10;4 5             Interlocked.Exchange(ref i, 30);6 7             Console.WriteLine(i);  //i=308         }

5:CompareExchange

所谓的比较操作,还是看看经典的MSDN的说法

如果相等,返回第二个参数值:

  static void Main(string[] args)        {            int i = 10;

Interlocked.CompareExchange(ref i, 30, 10);

Console.WriteLine(i);  //i=30        }

如果不相等,则返回原始值:

1  static void Main(string[] args)2         {3             int i = 10;4 5             Interlocked.CompareExchange(ref i, 30, 100);6 7             Console.WriteLine(i);  //i=108         }

转载地址:http://www.cnblogs.com/huangxincheng/archive/2012/03/16/2402320.html

时间: 2024-11-04 08:24:29

【转载】5天不再惧怕多线程——第三天 互斥体的相关文章

【转载】5天不再惧怕多线程——第一天 尝试Thread

原本准备在mongodb之后写一个lucene.net系列,不过这几天用到多线程时才发现自己对多线程的了解少之又少,仅仅停留在lock上面, 故这几天看了下线程参考手册结合自己的心得整理一下放在博客上作为自己的学习笔记. 好了,我们知道"负载"是一个很时尚,很牛X的玩意,往大处说,网站需要负载,数据库需要负载.往小处说,线程也需要负载,面对海量的 用户请求,我们的单线程肯定扛不住,那么怎么办,一定要负载,所以说多线程是我们码农必须要熟练掌握的一门技术. 在framework中给我们提供

【转载】5天不再惧怕多线程——第二天 锁机制

当多个线程在并发的时候,难免会碰到相互冲突的事情,比如最经典的ATM机的问题,并发不可怕,可怕的是我们没有能力控制. 线程以我的理解可以分为三种 ① 锁. ② 互斥. ③ 信号. 好,这一篇主要整理"锁",C#提供了2种手工控制的锁 一:  Monitor类 这个算是实现锁机制的纯正类,在锁定的临界区中只允许让一个线程访问,其他线程排队等待.主要整理为2组方法. 1:Monitor.Enter和Monitor.Exit 微软很照护我们,给了我们语法糖Lock,对的,语言糖确实减少了我们

【转载】5天不再惧怕多线程——第四天 信号量

今天整理"信号量"的相关知识,其实想想也蛮有趣的,锁,互斥,信号量都可以实现线程同步,在framework里面主要有三种. <1>:ManualResetEvent <2>:AutoResetEvent <3>: Semaphore 好,下面就具体看看这些玩意的使用. 一:ManualResetEvent 该对象有两种信号量状态True和False,好奇的我们肯定想知道True和False有什么区别,稍后的例子见分晓,有三个方法值得学习一下. 1:W

【转载】5天不再惧怕多线程——第五天 线程池

说到多线程,不可不说线程池,C#中关于池的概念很多,今天来整理下ThreadPool的使用. 是的,如果你很懒,如果你的执行任务比较短,如果你不想对线程做更精细的控制,那么把这些繁琐的东西丢给线程池吧. 一:ThreadPool 好了,下面看看TheadPool下有哪些常用的方法. 1:GetMaxThreads,GetMinThreads 首先我们肯定好奇线程池到底给我们如何控制线程数,下面就具体的看一看. 1 class Program 2 { 3 static void Main(stri

C++多线程同步技巧(三)--- 互斥体

简介 Windows互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处. 代码样例 //////////////////////////////// // // FileName : MutexDemo.cpp // Creator : PeterZheng // Date : 2018/10/23 21:27 // Comment : The usage of "Creat

[转] 从此不再惧怕URI编码:JavaScript及C# URI编码详解

混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Server.UrlEncode.Uri.EscapeUriString.Uri.EscapeDataString JavaScript中的还好,只提供了三个,C#中主要用的就有这么多,还没有列出其他编码(HTML),一多就弄不明白,弄不明白就心生恐惧,心生恐惧就变得苦逼,本文就向大家详细解释在JavaSc

“全栈2019”Java多线程第三十章:尝试获取锁tryLock()方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十章:尝试获取锁tryLock()方法详解 下一章 "全栈2019"Java多线程第三十一章:中断正在等待显式锁的线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复

“全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十五章:如何获取线程被等待的时间? 下一章 "全栈2019"Java多线程第三十六章:如何设置线程的等待截止时间 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&qu

Java 多线程(三) 线程的生命周期及优先级

Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处于创建状态. 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源. 2.可运行状态: 执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体——run()方法,这样就使得该线程处于可运行状态(Runnable). 这一