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