zoukankan      html  css  js  c++  java
  • Mutex::AutoLock介绍

    互斥类—Mutex
    Mutex是互斥类,用于多线程访问同一个资源的时候,保证一次只有一个线程能访问该资源。在《Windows核心编程》①一书中,对于这种互斥访问有一个很形象的比喻:想象你在飞机上如厕,这时卫生间的信息牌上显示“有人”,你必须等里面的人出来后才可进去。这就是互斥的含义。
    下面来看Mutex的实现方式,它们都很简单。
    (1)Mutex介绍
    其代码如下所示:
    [-->Thread.h::Mutex的声明和实现]

    1. inline Mutex::Mutex(int type, const char* name) {  
    2.     if (type == SHARED) {  
    3.        //type如果是SHARED,则表明这个Mutex支持跨进程的线程同步。  
    4.       //以后我们在Audio系统和Surface系统中会经常见到这种用法。  
    5.         pthread_mutexattr_t attr;  
    6.         pthread_mutexattr_init(&attr);  
    7.         pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);  
    8.         pthread_mutex_init(&mMutex, &attr);  
    9.         pthread_mutexattr_destroy(&attr);  
    10.     } else {  
    11.         pthread_mutex_init(&mMutex, NULL);  
    12.     }  
    13. }  
    14. inline Mutex::~Mutex() {  
    15.     pthread_mutex_destroy(&mMutex);  
    16. }  
    17. inline status_t Mutex::lock() {  
    18.     return -pthread_mutex_lock(&mMutex);  
    19. }  
    20. inline void Mutex::unlock() {  
    21.     pthread_mutex_unlock(&mMutex);  
    22. }  
    23. inline status_t Mutex::tryLock() {  
    24.     return -pthread_mutex_trylock(&mMutex);  
    25. }  

    关于Mutex的使用,除了初始化外,最重要的是lock和unlock函数的使用,它们的用法如下:
     要想独占卫生间,必须先调用Mutex的lock函数。这样,这个区域就被锁住了。如果这块区域之前已被别人锁住,lock函数则会等待,直到可以进入这块区域为止。系统保证一次只有一个线程能lock成功。
     当你“方便”完毕,记得调用Mutex的unlock以释放互斥区域。这样,其他人的lock才可以成功返回。

     另外,Mutex还提供了一个trylock函数,该函数只是尝试去锁住该区域,使用者需要根据trylock的返回值来判断是否成功锁住了该区域。
    注意 以上这些内容都和Raw API有关,不了解它的读者可自行学习相关知识。在Android系统中,多线程也是常见和重要的编程手段,务必请大家重视。Mutex类确实比Raw API方便好用,不过还是稍显麻烦。

    (2)AutoLock类 是定义在Mutex内部的一个类,它其实是一帮“懒人”搞出来的,为什么这么说呢?先来看看使用Mutex有多麻烦:
     显示调用Mutex的lock。
     在某个时候记住要调用该Mutex的unlock。
    以上这些操作都必须一一对应,否则会出现“死锁”!在有些代码中,如果判断分支特别多,你会发现unlock这句代码被写得比比皆是,如果稍有不慎,在某处就会忘了写它。有什么好办法能解决这个问题吗?终于有人想出来一个好办法,就是充分利用了C++的构造和析构函数,只需看一看AutoLock的定义就会明白。代码如下所示:
    [-->Thread.h Mutex::Autolock声明和实现]   

    1. class Autolock {  
    2.     public:  
    3.         //构造的时候调用lock。  
    4.         inline Autolock(Mutex& mutex) : mLock(mutex)  { mLock.lock(); }  
    5.         inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); }  
    6.         //析构的时候调用unlock。  
    7.         inline ~Autolock() { mLock.unlock(); }  
    8.     private:  
    9.         Mutex& mLock;  
    10.     };  

    AutoLock的用法很简单:


     先定义一个Mutex,如 Mutex xlock。
     在使用xlock的地方,定义一个AutoLock,Mutex::Autolock autoLock(xlock)

    由于C++对象的构造和析构函数都是自动被调用的,所以在AutoLock的生命周期内,xlock的lock和unlock也就自动被调用了,这样就省去了重复书写unlock的麻烦,而且lock和unlock的调用肯定是一一对应的,这样就绝对不会出错。



  • 相关阅读:
    蓝桥网试题 java 基础练习 特殊的数字
    蓝桥网试题 java 基础练习 杨辉三角形
    蓝桥网试题 java 基础练习 查找整数
    蓝桥网试题 java 基础练习 数列特征
    蓝桥网试题 java 基础练习 字母图形
    蓝桥网试题 java 基础练习 01字串
    蓝桥网试题 java 基础练习 回文数
    蓝桥网试题 java 基础练习 特殊回文数
    Using text search in Web page with Sikuli
    each of which 用法
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744592.html
Copyright © 2011-2022 走看看