《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代码 public class Singleton { private static Singleton instance; private Singleton ...
- python's eleventh day for me
python2 中没有nonlocal. 函数名是什么? 函数名就是函数的名字, 本质:变量,特殊的变量. 1.单独打印函数名: def func(): print(666) print(func) ...
- java - 读取,导出 excel文件数据
首先需下载poi java包,添加至构建路径, 写处理方法: import java.io.FileInputStream;import java.io.FileOutputStream;import ...
- C# winform开发
一处消息死锁分析 最近维护一个工控机上运行的winform程序,我的前任在一个弹出窗口(窗口B)里面调用了ShowDialog方法弹出对话框(窗口C),导致了一个问题是有时关闭窗口C时windows假 ...
- 自定义对话框<转>
效果如下: <ignore_js_op> QQ截图20130221234404.png (51.02 KB, 下载次数: 126) 下载附件 保存到相册 2013-2-21 23:44 ...
- CSS中盒子垂直居中的常用方法
在前端开发过程中,盒子居中是常常用到的.其中 ,居中又可以分为水平居中和垂直居中.水平居中是比较容易的,直接设置元素的margin: 0 auto就可以实现.但是垂直居中相对来说是比较复杂一些的.下面 ...
- python的ftplib模块
Python中的ftplib模块 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件 FTP的工作流程及基本操作可参考协议RFC95 ...
- 使用axis2进行WebService的开发
使用axis2进行WebService的开发 Apache Axis2 是 Apache Axis SOAP 项目的后继项目.此项目是 Web 服务核心引擎的重要改进,目标是成为 Web 服务和面向服 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 2_Linear regression with one variable 单变量线性回归
Lecture2 Linear regression with one variable 单变量线性回归 2.1 模型表示 Model Representation 2.1.1 线性回归 Li ...
- xcode找回欢迎界面
[xcode找回欢迎界面] 有一次嫌xcode界面烦,点击了以下checkbox取消了欢迎界面: 随后发现没了欢迎界面反而更不方便,一心想找回欢迎界面,Preference里找了半天没找到开关,原来开 ...