在 frameworks/base/libs/binder/ProcessState.cpp 的 startThreadPool() 函數中,
函數一開始,就聲明瞭:
AutoMutex _l(mLock);
就去了解了一下,不復雜,但感覺很有思想。
在 frameworks/base/include/utils/threads.h 中,有:
- class Mutex {
- ... ...
- class Autolock {
- public:
- inline Autolock(Mutex& mutex) : mLock(mutex) { mLock.lock(); }
- inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); }
- inline ~Autolock() { mLock.unlock(); }
- private:
- Mutex& mLock;
- };
- ... ...
- };
- typedef Mutex::Autolock AutoMutex;
可以看出,在構造函數中 mLock.lock() 加鎖,在析構函數中 mLock.unlock() 解鎖。
所以,對一個需要加鎖的函數來說,我們只需要在函數開始處,聲明這樣 AutoMutex _l(mLock) 一個變量,它就會加鎖,
等函數退出時,這樣一個臨時變量就會析構,就會解鎖。