Mutex::AutoLock介紹


  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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM