概述
//http://msdn.microsoft.com/zhcn/vcsharp/system.threading.mutex_members.aspx
Monitor通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁,也就是这个对象的锁只能有一个线程获得 而互斥体Mutex却不是,多个线程可以拥有同一个资源,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。也就是可以多个线程共同拥有,当然,独占访问权只有一个线程获得。Mutex的用法可以想像,大家都想做某件事前,要先取得一个许可金牌才能做,等做完了才将这金牌Release出来,其他人只能一直等,直到取得金牌的拥有权後,方能做事。
在.Net重,Mutex类是同步基元,它只向一个线程授予对共享资源的独占访问权。下面是MSDN的例子.
using System;
using System.Threading;
class Test
{
private static Mutex mut = new Mutex();
private const int numIterations = 1;
private const int numThreads = 3;
static void Main()
{
for(int i = 0; i < numThreads; i++)
{
Thread myThread = new Thread(new ThreadStart(MyThreadProc));
myThread.Name = String.Format("Thread{0}", i + 1);
myThread.Start();
}
}
private static void MyThreadProc()
{
for(int i = 0; i < numIterations; i++)
{
UseResource();
}
}
private static void UseResource()
{
mut.WaitOne();
Console.WriteLine("{0} has entered the protected area",
Thread.CurrentThread.Name);
Thread.Sleep(500);
Console.WriteLine("{0} is leaving the protected area/r/n",
Thread.CurrentThread.Name);
mut.ReleaseMutex();
}
}
Mutex物件的做法与特性如下:
使用CreateMutex()来产生一个Mutex物件,而传入的Mutex名称字串用以区别不同的Mutex
,也就是说,不管是哪个Process/Thread,只要传入的名称叁数是相同的一个字串,那
CreateMutex()传回值(hMutex, handle of Mutex)会指向相同的一个Mutex物件。这和
Event物件相同。然而Mutex和Event有很大的不同,Mutex有Owner的概念,如果Mutex为
ThreadA所拥有,那麽ThreadA执行WaitForSingleObject()时,并不会停下来,而会立即
传回WAIT_OBJECT_0,而其他的Thread执行WaitForSingleObject()则会停下来,直到Mutex的所有权被Release出来或Time Out。而Thread如何取得Mutex的所有权呢?主要如下:
1.CreateMutex(Byval 0, 1, "MyMutex") 第二个叁数传1进去,则第一个呼CreateMutex
且第二个叁数传1的Thread会拥有该Mutex。但如果第二个叁数传0进去,那代CreateMutex时,没有人拥有该Mutex。
2.承上的说明,如果Mutex没有拥有者,则第一个呼叫WaitForSingleObject的Thread
会拥有该Mutex。
上面说过,只有拥有该Mutex的Thread在执行WaitForSingleObject()不会停下来,其他的
Thread则会停下来,那其他的Thread如何取得该Mutex的所有权呢?那必需是原先拥有该
Mutex的Thread以ReleaseMutex来放弃所有权,一旦所有权放出来,而有其他的Thread处
於WaitForSingleObject()的停留等待状态,则有一个Thread会即时取得该Mutex的所有权
(上面第2点的说明),所以,若其他的Thread也执行WaitForSingleObject()时,就会处於
等待的状态。正因WaitForSingleObject()会令Mutex处於UnSignal的状态(和Event不同),
所以可以完成同一时问只有一个thread来UpDate共用记忆体的需求(当然大家都要使用Mutex
的规则则来做,即想Update时,要使用WaitForSingleObject()来看看是否可取得Mutex的所
有权。)
另有一件事要特别提出,如果一个Thread已取得Mutex的所有权,而它呼叫WaitForSingleObject()n 次,则也要使用ReleaseMutex n次才能够将Mutex的拥有权放弃,这和Event也不同,而且,非Mutex拥有者呼叫ReleaseMutex也不会有任何作用。而每次以WaitForSingleObject呼叫一次,Mutex会有一个计数器会加一,ReleaseMutex成功会减一,直到Mutex的计数器为0之後,系统才会将之去除。
以下用一个Class来做Mutex
方法
Create(ByVal MutexName As String) 传入Mutex的识别名称,如果成功传回1,已
Create过传回0,失败传回-1
GetOwnerShip() 传回值 1: 表已取得所有权 0:timeout -1:有误
ReleaseOwnerShip() 传回值 1表ReleaseMutex成功 0失败
属性
TimeOut 要GetOwnerShip时Time Out的时间,千分之一秒为单位
CreateWithOwnerShip true表Create时,就顺带取得Mutex的所有权
最后
以上就是拼搏鸡为你收集整理的mutex用法和例子的全部内容,希望文章能够帮你解决mutex用法和例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复