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的所有权

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的mutex(互斥量)用于实现线程之间的互斥访问,以确保在同一时间只有一个线程可以访问共享资源。引用\[1\]中的代码展示了mutex用法。在这个例子中,使用了std::mutex类来创建一个互斥量对象mtx。在print_block函数中,通过调用mtx.lock()和mtx.unlock()来实现对临界区的互斥访问。这样可以确保在一个线程访问临界区时,其他线程无法同时访问。 另外,C++11还引入了std::recursive_mutex类,它与std::mutex类似,但允许同一个线程多次对互斥量进行加。这在某些情况下可以避免死问题。引用\[3\]中的代码展示了std::recursive_mutex用法。在这个例子中,使用了std::recursive_mutex类来创建一个递归互斥量对象mtx。在func1和func2函数中,通过调用mtx.lock()和mtx.unlock()来实现对临界区的互斥访问。同时,由于使用了递归互斥量,func2函数可以在func1函数中被多次调用而不会导致死。 总结来说,C++中的mutex用于实现线程之间的互斥访问,确保在同一时间只有一个线程可以访问共享资源。通过调用lock()和unlock()函数来实现对临界区的互斥访问。同时,C++11还引入了递归互斥量std::recursive_mutex,允许同一个线程多次对互斥量进行加,以避免死问题。 #### 引用[.reference_title] - *1* *2* [c++ mutex](https://blog.csdn.net/fuhanghang/article/details/114076161)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++mutex使用](https://blog.csdn.net/sinat_31608641/article/details/107733436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值