线程同步方式之互斥量Mutex
互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的。
互斥量相对于临界区更为高级,可以对互斥量进行命名,支持跨进程的线程同步。互斥量是调用的Win32的API对互斥锁的操作,因此在同一操作系统下不同进程可以按照互斥锁的名称共享锁。
正因为如此,互斥锁的操作会更好资源,性能上相对于临界区也有降低,在使用时还要多斟酌。对于进程内的线程同步使用临界区性能会更佳。
在.Net中使用Mutex类来表示互斥量,使用实例的WaitOne()阻止线程执行至到获取Mutex对象,ReleaseMutex()释放锁资源,我们来看一下示例
class MutexTest
{
//创建Mutex对象
private static Mutex mutex = new Mutex(true, "My");
//
static void Main(string[] args)
{
Run();
Console.ReadLine();
}
//模拟多线程调用
public static void Run()
{
const int count = 2;
var threads = new Thread[count];
for (var i = 0; i < count; i++)
{
var ts = new ThreadStart(UserResource);
var t = new Thread(ts);
t.Name = "thread" + (i + 1);
threads[i] = t;
}
foreach (var t in threads)
{
t.Start();
}
//
Console.WriteLine(string.Format("Creating thread {0} owns the Mutex.", Thread.CurrentThread.Name));
Thread.Sleep(1000);
mutex.ReleaseMutex();
Console.WriteLine(string.Format("Creating thread {0} releases the Mutex.", Thread.CurrentThread.Name));
}
//修改共享资源值
public static void UserResource()
{
mutex.WaitOne();
Console.WriteLine(string.Format("Child thread named {0} owns the mutex.", Thread.CurrentThread.Name));
Thread.Sleep(1000);
mutex.ReleaseMutex();
Console.WriteLine(string.Format("Child thread named {0} releases the mutex.", Thread.CurrentThread.Name));
}
}
Mutex对象是一个全局对象,构造时可以指定name,只要name一样都认为是同一个Mutext。另外再构造时指定的第一个Bool参数表示创建Mutex对象的线程是否拥有该互斥量。
如果是True表示拥有,必须要释放后才可以被其它线程使用。上述代码示例中就需要主线程释放Mutex。
首先由主线程创建一个Mutex对象,并拥有该Mutex对象
然后主线程接着执行,创建2个线程,线程内部使用WaitOne来阻止该线程继续执行,直到接收到Mutex对象释放的信号,方能获得Mutex使用权,继续执行。
Sleep 1秒之后,主线程释放Mutex对象
子线程WaitOne获得释放信号并抢占Mutex拥有权,获得者将进入执行资源代码,而另外的子现在要等到ReleaseMutex之后才能获得Mutex拥有权。
在使用Mutex时WaitOne用来阻止线程的执行,直到获取到Mutex对象的拥有权。也可以指定阻止时间,超时获取Mutex拥有权失败,会继续执行后续代码,执行完毕无需释放Mutex。
WaitOne要和ReleaseMutex成对使用,获取锁对象后要记得释放,否则会造成其它线程一直等待状态。
线程同步方式之互斥量Mutex的更多相关文章
- Linux的线程同步对象:互斥量Mutex,读写锁,条件变量
进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...
- Linux/Unix 线程同步技术之互斥量(1)
众所周知,互斥量(mutex)是同步线程对共享资源访问的技术,用来防止下面这种情况:线程A试图访问某个共享资源时,线程B正在对其进行修改,从而造成资源状态不一致.与之相关的一个术语临界区(critic ...
- c# Thread5——线程同步之基本原子操作。Mutex互斥量的使用
之前的博文也说到了如果多线程对于访问的公共资源操作都是原子操作,那么可以避免竞争条件.关于多线程的竞争可以百度. 1.执行最基本的原子操作 c#提供了一系列供我们使用的原子操作的方法和类型,比如我们的 ...
- 经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- (转)经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 多线程面试题系列(7):经典线程同步 互斥量Mutex
前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似, ...
- 秒杀多线程第七篇 经典线程同步 互斥量Mutex
本文转载于:http://blog.csdn.net/morewindows/article/details/7470936 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用 ...
- 转--- 秒杀多线程第七篇 经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- [一个经典的多线程同步问题]解决方案三:互斥量Mutex
本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...
随机推荐
- C#Redis 常用key操作
一.前戏 在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List.Set.Hashes和Sorted-Set.这些命令都具有一个共同点,即所有的操作都是针对与Ke ...
- GCD之Source
参考:http://blog.csdn.net/lengshengren/article/details/12905811
- WPF备忘录(6)WPF实现打印功能
在WPF 中可以通过PrintDialog 类方便的实现应用程序打印功能,本文将使用一个简单实例进行演示.首先在VS中编辑一个图形(如下图所示). 将需要打印的内容放入同一个<Canvas> ...
- IIS日志自动清理
IIS在运行的过程中日志会不停地增长,若iis的网站被频繁的调用或不当的调用,则会产生很多日志.我在系统运维的时候曾出现过20G的系统盘,由于合作商开发的程序有问题,每几百微秒调用一次web服务,短期 ...
- maven的注意点
一.dependency的scope 取值范围:compile.test.runtime.provided.system compile 默认就是compile,什么都不配置也就是意味着compile ...
- imanager一些常用方法汇总
一.求和函数(根据键值数组求键值的总和) function sum(arr){ //arr是传入的值数组,格式如["张三","李四","王五" ...
- AJAX的一些基础和AJAX的状态
大佬们,我又回来了,最近好几天都没写博客了,别问我干啥去了,我只是去围观奶茶妹变成抹茶妹而已 前几天我们一起封装了一个AJAX,那今天我们来说说AJAX的一些基础和AJAX的状态码 首先,啥是AJAX ...
- ActiveReports 区域报表中的事件介绍
1.仅触发一次的事件 以下是在报表的处理过程中仅触发一次的所有事件这些事件在报表的处理周期中仅在最开始和结束前触发一次. ReportStart 该事件在DataInitialize事件触发之前发生. ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 4
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 3------------------- 17 带比较运算符的嵌套查询 ...
- JQuery判断数组中是否包含某个字符串
var arry = [ "C#", "html", "css", "JavaScript" ]; var result ...