Skip to main content
 首页 » 编程设计

Mutex::AutoLock介绍

2022年07月19日67jiqing9006

  AutoLock类是定义在Mutex内部的一个类,用于解决lock和unlock必须必须一一对应的问题。unlock这句代码可能会忘记写,从而导致死锁。AutoLock充分利用了C++的构造和析构函数,来达到自动调用unlock函数的目的。

Mutex::Autolock声明和实现:

class Autolock { 
public: 
    //构造的时候调用lock。 
    inline Autolock(Mutex& mutex) : mLock(mutex)  { mLock.lock(); } 
    inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); } 
    //析构的时候调用unlock。 
    inline ~Autolock() { mLock.unlock(); } 
private: 
    Mutex& mLock; 
};

注意事项:
  Autolock对象应该被定义为局部变量中的局部变量,最好作用域仅仅只覆盖要lock住的代码块。这样在生命周期结束时就自动的把资源锁解了,同时也不会导致锁住的区域过大。

下面是个例子,此例子中在{}代码块里面定义Autolock的对象_l,它的生命周期只在{}内部,也就是说只对那个if语句体上锁:

//SurfaceFlinger.cpp 
void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) { 
    bool needsHwVsync = false; 
 
    { // Scope for the lock 
        Mutex::Autolock _l(mHWVsyncLock); 
        if (type == 0 && mPrimaryHWVsyncEnabled) { 
            needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp); 
        } 
    } 
 
    if (needsHwVsync) { 
        enableHardwareVsync(); 
    } else { 
        disableHardwareVsync(false); 
    } 
}

本文参考链接:https://www.cnblogs.com/hellokitty2/p/10894775.html