这个真的是大坑。

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

但是书上有没有讲。

完全不知道什么意思。

勉勉强强讲这个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. PCB上 如何显示 汉字

    原理图上有汉字,那如何在PCB上显示汉子呢  ?  而不至于显示乱码 按如下操作  ,双击乱码  ,进入设置模式 设置好后,显示的字体样式.

  2. popup功能

    urls: #!/usr/bin/env python3 # -*- coding: utf-8 -*- from django.conf.urls import url from chapter01 ...

  3. Win7 IE11 F2无法切换版本

    Win7 IE11 F2无法切换版本 http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=45154 选择操作系统对应的版本 ht ...

  4. [故障及解决]SoundPool没有声音

    问题描述:使用SoundPool类进行播放声音时,在手机上没有声音. 问题代码: /** * 声音播放 */ private void playSound() { SoundPool soundPoo ...

  5. DataGridView根据条件给单元格绑定图片

    代码区: private void Form1_Load(object sender, EventArgs e) { myClass.mySqliteAPI conn = new myClass.my ...

  6. HBase 官方文档中文版

    地址链接: http://abloz.com/hbase/book.html 里面包含基本的API和使用说明

  7. Ubuntu16.04安装之后的几个设置

    Ubuntu16.04安装之后的几个设置 Ubuntu16.04界面很漂亮,但是安装之后,需要做如下几个简单的设置,这样用的时候会更加顺畅. 1.中文支持 在右上角有一个齿轮,点击->Syste ...

  8. A Look at the Razor View Engine in ASP.NET MVC

    The biggest architectural difference that exists between ASP.NET MVC and ASP.NET Web Forms is the ne ...

  9. Apache Hive 简介及安装

    简介 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件 映射为一张数据库表,并提供类 SQL 查询功能. 本质是将 SQL 转换为 MapReduce 程序. 主要用途:用来 ...

  10. 在Build Path中包含其他工程

    ------------siwuxie095                                 在 TestBuildPath 的 Build Path 中包含 SupportProje ...