说起Mutex,它的中文名字叫互斥体。它是WaitHandle家族成员之一,前面有一篇介绍过WaitHandle的家族成员构成。那么Mutex有什么作用呢?它是怎么使用的?

我们先来看看它的使用场景一:

话说小王同学做了wpf的客户端程序,现在已经打包好了,准备发布出去,结果在本地测试时,突然发现他的程序可以打开多个登录窗口,于是慌了。这可如何是好,他和同事一起在网上搜索相关资料,查询如何保证程序每次只打开一个进程。详见代码:

   static System.Threading.Mutex mutex = null;
protected override void OnStartup(StartupEventArgs e)
{
bool canCreate= false;
mutex = new System.Threading.Mutex(true, "Sharey", out canCreate);
if (canCreate)
{
RegisterEvents();
base.OnStartup(e);
}
else
{
Environment.Exit();
}
}

分析下代码,程序中第5行,创建了Mutex 对象,其实这个对象由操作系统管理,它的拥有权,属于当前调用的线程,而且还起了一个名字,这个名字是唯一的,不能重复。当另外一个线程也打算创建相同名称的Mutex 对象时,就会返回false,此时程序中的canCreate为false,那么就直接退出当前应用程序,这样利用互斥对象,就确保了操作系统中,同时只能拥有一个进程在运行,这是不同进程中的线程同步问题

我们再来看看它的使用场景二:

     如今的时代,以瘦为美,所以美女们对自己的体重很关心,每次经过药店门口时,都会有人称体重,旁边还会站有1-2个人在等待。显然这个免费的称体重的称是个稀缺资源,不可多得呀,这个巷子就只有这么一台。回到我们程序的世界,不过是借鉴了现实世界中的很多解决问题的思路而已。看代码:

         static Mutex mt = new Mutex();
static int peopleCount = ;
static void Main(string[] args)
{
for (var i = ; i < peopleCount; i++)
{
var t = new Thread(Weigh);
t.Name = (i + ).ToString();
t.Start();
} Console.Read();
} static void Weigh()
{
mt.WaitOne();
Console.WriteLine(String.Format("{0}-People{1}上称", DateTime.Now.ToString(), Thread.CurrentThread.Name));
Thread.Sleep();
Console.WriteLine(String.Format("{0}-People{1}下称", DateTime.Now.ToString(), Thread.CurrentThread.Name));
mt.ReleaseMutex();
}

运行结果如下:

17行,Waitone,就是等待,如果称上没人,就上去了,显然此时形同给称加了把锁,21行, 执行了ReleaseMutex,释放了这个锁,其它人就可以上去了。现实生活中的例子很多,比如一台ATM,同时只允许一个人操作,等操作完了,其他人再操作。

c# 多线程同步之Mutex的更多相关文章

  1. 【转】windows平台多线程同步之Mutex的应用

    线程组成:  线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量.   操作系统为每一个运行线程安排一定的CPU时间 —— 时间片.系统通 ...

  2. C++多线程同步之Mutex(互斥量)

    原文链接: http://blog.csdn.net/olansefengye1/article/details/53086141 一.互斥量Mutex同步多线程 1.Win32平台 相关函数和头文件 ...

  3. Linux多线程同步方式

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...

  4. C# 多线程同步和线程通信

    多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...

  5. 多线程同步内功心法——PV操作上(未完待续。。。)

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

  6. 起底多线程同步锁(iOS)

    iOS/MacOS为多线程.共享内存(变量)提供了多种的同步解决方案(即同步锁),对于这些方案的比较,大都讨论了锁的用法以及锁操作的开销,然后就开销表现排个序.春哥以为,最优方案的选用还是看应用场景, ...

  7. Windows多线程同步系列之一-----互斥对象

    多线程同步之互斥对象 作者:vpoet mail:vpoet_sir@163.com   对卖票问题进行线程间同步,本文将在上文的基础上,使用互斥对象对线程进行同步. 首先看看windows API ...

  8. 收藏:c语言的多线程同步

    1.<秒杀多线程第一篇 多线程笔试面试题汇总> 2.<秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别> 3.<秒杀 ...

  9. windows多线程同步

    概述 任何单个应用程序都不能完全使该处理器达到满负荷.当一个线程遇到较长等待时间事件时,同步多线程还允许另一线程中的指令使用所有执行单元.例如,当一个线程发生高速缓存不命中,另一个线程可以继续执行.同 ...

随机推荐

  1. 工作笔记--自动切换host的python code

    修改host代码: #coding:utf-8import os,timepwd = os.path.dirname(__file__) #获取当前文件夹的绝对路径pull_host_cmd = 'a ...

  2. Java经典编程题50道之三十一

    将一个数组逆序输出. public class Example31 {    public static void main(String[] args) {        int[] a = { 9 ...

  3. 高性能javascript笔记

    ----------------------------------------------------------- 第一章 加载和执行 ------------------------------ ...

  4. python+flask:实现POST接口功能

    1.首先需要安装python和flask,这个是必须的嘛. 2.我们这里实现的是一个POST功能的简单接口. from flask import Flask, request, jsonify imp ...

  5. dubbox系列【三】——简单的dubbox提供者+消费者示例

    1.dubbox-provider示例 在eclipse中建立maven project,名为provider-parent,包含两个maven medule:provider-api 和 provi ...

  6. BUNOJ 1011

    字符串处理的题.原题链接 AC代码: #include<cstring> #include<cstdio> #include<string> #include< ...

  7. Kaggle新手入门之路

    学完了Coursera上Andrew Ng的Machine Learning后,迫不及待地想去参加一场Kaggle的比赛,却发现从理论到实践的转变实在是太困难了,在此记录学习过程. 一:安装Anaco ...

  8. spring+mybatis+c3p0数据库连接池或druid连接池使用配置整理

    在系统性能优化的时候,或者说在进行代码开发的时候,多数人应该都知道一个很基本的原则,那就是保证功能正常良好的情况下,要尽量减少对数据库的操作. 据我所知,原因大概有这样两个: 一个是,一般情况下系统服 ...

  9. PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注

    PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...

  10. GitHub上最火的Android开源项目整理

    这篇文章介绍GitHub上另外34个非常受欢迎的Android开源项目,在这些项目中,你又在用或用过哪些呢? 41. android-swipelistview SwipeListView是一个And ...