《C#多线程编程实战》2.3 Mutex
这个真的是大坑。
如果深入研究,像是同步域,上下文这类都会出现。
但是书上有没有讲。
完全不知道什么意思。
勉勉强强讲这个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的更多相关文章
- C#多线程编程实战(二)
1.1 简介 为了防止一个应用程序控制CPU而导致其他应用程序和操作系统本身永远被挂起这一可能情况,操作系统不得不使用某种方式将物理计算分割为一些虚拟的进程,并给予每个执行程序一定量的计算能力.此外操 ...
- Java多线程编程实战读书笔记(一)
多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.
- Java多线程编程实战指南(核心篇)读书笔记(五)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(四)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(三)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(一)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- ASP.Net教程系列:多线程编程实战(一)
Web开发中使用多线程可以增强用户体验,尤其是多用户.多任务.海量数据和资源紧张的情况下.所以我们的ASP.Net教程设立多线程编程实战专题.下面这些代码范例都是入门级的,希望对对大家学习ASP.Ne ...
- 《Java多线程编程实战指南(核心篇)》阅读笔记
<Java多线程编程实战指南(核心篇)>阅读笔记 */--> <Java多线程编程实战指南(核心篇)>阅读笔记 Table of Contents 1. 线程概念 1.1 ...
- Java多线程编程实战02:多线程编程模型
多线程编程模型 线程安全名词 串行.并发和并行 串行:一个人,将任务一个一个完成 并发:一个人,有策略地同时做多件事情 并行:多个人,每人做一个事情 竞态 名词 竞态:计算结果的正确性与时间有关的现象 ...
随机推荐
- 如何准确计算Java对象的大小
如何准确计算Java对象的大小 原创文章,转载请注明:博客园aprogramer 原文链接:如何准确计算Java对象的大小 有时,我们需要知道Java对象到底占用多少内存,有人通过连续调用两 ...
- C# IP地址去掉端口号
string Ip1 = "192.168.0.199:7777"; string Ip2 = Ip1.Remove(Ip1.IndexOf(':'));
- 分布式爬虫搭建系列 之二-----神器PyCharm的安装
这里我们使用PyCharm作为开发工具,以下过程摘抄于:http://blog.csdn.net/qq_29883591/article/details/52664478 作者:陌上行走 Pytho ...
- 前端自动化之nvm安装
nvm ——node环境版本控制工具. 1.解压安装包 2.打开setting文件,修改文件内容 root: D:\node\nvm path: D:\node\nodejs arch: proxy: ...
- 「小程序JAVA实战」 小程序私有页面的生命周期以及导航(10)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-10/ 之前讲了小程序全局的生命周期,今天咱们说说单个页面的生命周期!源码:https://gith ...
- Java微信公众平台开发(八)--多媒体消息回复
转自:http://www.cuiyongzhi.com/post/46.html 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消 ...
- 如何POST一个JSON格式的数据给java接口,获得返回数据
/** * 模拟post进行url请求 * @param string $url * @param json $post_data */ public function request_post($u ...
- Perl 数据类型:标量、数组、哈希
Perl 数据类型Perl 是一种弱类型语言,所以变量不需要指定类型,Perl 解释器会根据上下文自动选择匹配类型. Perl 有三个基本的数据类型:标量.数组.哈希.以下是这三种数据类型的说明: 序 ...
- Collection Types
[Collection Types] 1.Arrays store ordered lists of values of the same type. Value必须是同一类型. 2.Array的原型 ...
- 283. Move Zeroes把零放在最后面
[抄题]: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...