我是靠谱客的博主 拼搏鸡,最近开发中收集的这篇文章主要介绍mutex用法和例子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

//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用法和例子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部