Mutex使用

 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之後,系统才会将之去除。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`std::mutex` 是 C++ 标准库中的一个互斥锁(Mutex)类,用于同步多个线程对共享资源的访问,防止并发修改数据导致的数据不一致。当多个线程试图同时访问同一块代码或数据时,互斥锁能保证一次只有一个线程能够执行该代码段,其他线程需要等待当前持有锁的线程完成后再继续。 以下是 `std::mutex` 的主要使用方法和要点: 1. 创建和获取锁:你可以使用 `std::mutex` 构造函数创建一个锁,并通过 `lock()` 函数尝试获取锁。如果锁被其他线程占用,则调用会阻塞直到锁可用。 ```cpp std::mutex mtx; mtx.lock(); // 执行需要保护的代码 mtx.unlock(); // 任务完成后释放锁 ``` 2. 锁的释放:一定要记住,在代码中对应地释放已经获取的锁,否则可能导致死锁。如果程序意外退出而忘记解锁,应该避免使用自动解锁机制(如 RAII),因为这可能引发资源泄露。 3. 锁的优先级继承:C++11 引入了优先级继承,使得在某些情况下,一个高优先级线程可以暂时放弃其优先级,让低优先级但正在请求相同锁的线程执行,从而提高系统的响应性和效率。 4. 锁的嵌套:同一个线程可以在同一 `std::mutex` 上多次尝试获取锁,但在不同互斥锁上则应谨慎处理,避免循环嵌套,以免影响性能。 5. 使用范围限定:从 C++17 开始,可以使用范围锁定(`std::lock_guard` 或 `std::unique_lock`)来简化互斥锁管理,它们会在作用域结束时自动释放锁,避免忘记解锁的问题。 相关问题-- 1. 在什么情况下你会使用 `std::mutex`? 2. 如何避免在 C++ 中发生死锁问题? 3. 什么是 C++11 中的优先级继承?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值