这个真的是大坑。

如果深入研究,像是同步域,上下文这类都会出现。

但是书上有没有讲。

完全不知道什么意思。

勉勉强强讲这个Mutex的用法搞明白了。

这个是原书代码:

class Program
{
static void Main(string[] args)
{
const string MutexName = "CSharpThreadingCookbook"; using (var m = new Mutex(false, MutexName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(), false))
{
WriteLine("Second instance is running!");
}
else
{
WriteLine("Running!");
ReadLine();
m.ReleaseMutex();
}
}
}
}

同时运行两个程序时,会建立一个互斥锁。第一个程序拥有所有权。第二个等待5秒,如果未能拥有程序的所有权,则显示Second instance is running,如果等待5s之后拥有所有权就显示running

所谓互斥锁,通俗点说:

某人去ATM取钱时,在这个人则是拥有ATM的所有权,别人是无法使用这个ATM除非时这个人使用完毕。

互斥锁多为多线程使用,也是为了保护资源只被某一个对象使用。或者某一个线程使用。

其实这个例子并不是很好理解

可以改成:

 class TestClass
{
public void Test()
{
string staticStringName = "CSharp"; using (var m = new Mutex(false, staticStringName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(),false) )
{
Console.WriteLine("有另一个Test方法在运行 ");
}
else
{
Console.WriteLine("Test方法正在运行"); Console.ReadKey(); m.ReleaseMutex();
}
}
}
}
class Program
{ static void Main(string[] args)
{
var a = new TestClass(); new Thread(() => { a.Test(); }).Start();
new Thread(() => { a.Test(); }).Start();
Console.ReadKey(); }
}

这个方法相对原书的代码较为简单。

两个不同线程访问同一个资源。

但是第二线程只有等待第一个线程才可以访问。

用法很接近monitor.tryenter。

都是可以等待某一个资源是否访问。并且可以做出判断。

但是这个mutex的适用范围更广,不论是线程还是进程都是可以使用的,像是原书则是进程之间的互斥锁。

我的例子则是线程的例子。

来具体的解释一下原书代码

 const string MutexName = "CSharpThreadingCookbook";

 using (var m = new Mutex(false, MutexName))

Mutex执行的根本就是互斥锁。

那么用来作为锁的对象是谁呢?那就是MutexName的静态资源。

然是建立互斥锁

new Mutex(false, MutexName)

那么第一个参数是什么?

是当前调用的线程是否此线程的所有权,也可以直接理解为是否直接加锁。

第二个参数是互斥锁的名称

这个资源锁的名字就是互斥锁的名字,也就是说互斥锁在全局中只有这么一个唯一的名字。

其实Mutex的用法是相对简单了。只不过书上没介绍而已。

我们还是先说原书代码

  if (!m.WaitOne(TimeSpan.FromSeconds(),false) )

这句

我们说在实例化mutex的时候参数如果是false 是当前调用的线程是没有所有权的。但靠什么来获取线程锁呢?

也就是靠waitone方法!

WaitOne是用来获取互斥锁,

WaitOne有几个差不多的重载方法。

第一个参数是等待时间,可以用TimeSpan,Int

第二个是否退出同步域

感觉上用法适合TryEnter差不多的

再说代码:

m.ReleaseMutex();           

这个就是释放一次互斥锁。

一般用完资源之后就要释放,不然后面就等待这个互斥锁了。

虽然了解了书上的用法但是还有一点点的疑问

《C#多线程编程实战》2.3 Mutex的更多相关文章

  1. C#多线程编程实战(二)

    1.1 简介 为了防止一个应用程序控制CPU而导致其他应用程序和操作系统本身永远被挂起这一可能情况,操作系统不得不使用某种方式将物理计算分割为一些虚拟的进程,并给予每个执行程序一定量的计算能力.此外操 ...

  2. Java多线程编程实战读书笔记(一)

    多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.

  3. Java多线程编程实战指南(核心篇)读书笔记(五)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  4. Java多线程编程实战指南(核心篇)读书笔记(四)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  5. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  6. Java多线程编程实战指南(核心篇)读书笔记(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  7. Java多线程编程实战指南(核心篇)读书笔记(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  8. ASP.Net教程系列:多线程编程实战(一)

    Web开发中使用多线程可以增强用户体验,尤其是多用户.多任务.海量数据和资源紧张的情况下.所以我们的ASP.Net教程设立多线程编程实战专题.下面这些代码范例都是入门级的,希望对对大家学习ASP.Ne ...

  9. 《Java多线程编程实战指南(核心篇)》阅读笔记

    <Java多线程编程实战指南(核心篇)>阅读笔记 */--> <Java多线程编程实战指南(核心篇)>阅读笔记 Table of Contents 1. 线程概念 1.1 ...

  10. Java多线程编程实战02:多线程编程模型

    多线程编程模型 线程安全名词 串行.并发和并行 串行:一个人,将任务一个一个完成 并发:一个人,有策略地同时做多件事情 并行:多个人,每人做一个事情 竞态 名词 竞态:计算结果的正确性与时间有关的现象 ...

随机推荐

  1. 小程序WXML基本使用

    数据绑定 <!--wxml--> <view> {{message}} </view> // page.js Page({ data: { message: 'He ...

  2. 登陆验证系统实例-三种(cookie,session,auth)

    登陆验证 因为http协议是无状态协议,但是我们有时候需要这个状态,这个状态就是标识 前端提交from表单,后端获取对应输入值,与数据库对比,由此对象设置一个标识,该对象 在别的视图的时候,有此标识, ...

  3. MAC 10.6 64wei

    苹果电脑 Mac OS X 10.6 雪豹系统同时支持 32 位和 64 位模式,关于开启 64 位的好处,字太多,本文后半段介绍.下面先说查看你的苹果电脑是否开启了 64 位以及设置苹果电脑 Mac ...

  4. 参数传递中编码问题(Get/Post 方式)(一)

    用JAVA在做一个支付接口时,需要和表现层的UTF8代码进行报文交换,因JAVA是GBK编码的,因此出现了小插曲.为此,花了点时间,重新梳理一下相关知识点. 以下内容是我转载的,觉得挺好的.... 一 ...

  5. Debug 的使用

    R 命令:查看.修改寄存器的内容 -r:查看寄存器的内容 CS=0AF9,IP=0100,也就是说内存 0AF9:0100 处的指令为 CPU 当前要读取.执行的指令 Debug 也列出了 CS:IP ...

  6. LINUX免密登陆

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...

  7. 前端自动化之gulp

    前端自动化之gulp 前题:1.安装好nodejs环境,或者nvm 2.安装npm包管理工具 简介: 可以自动的将开发阶段的代码进行压缩.合并.编译.加密等处理,生成项目提交的代码. 使用: gulp ...

  8. django dynamic model

    django model 首先对于一个习惯用django model的骚年来说,你肯定对django model自定制用的很熟悉,但突然让你用django dynamic model,也许会有很多人懵 ...

  9. Unity3d平台信息设置

    [Unity3d平台信息设置] 通过"Edit" -> "Project Settings" -> "Player"菜单选项.打 ...

  10. 【原创】3. MYSQL++ Query类型与SQL语句执行过程(非template与SSQLS版本)

    我们可以通过使用mysqlpp:: Query来进行SQL语句的增删改查. 首先来看一下mysqlpp::Query的一些最简单的调用, conn.connect(mysqlpp::examples: ...