在 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) 一个变量,它就会加锁,
等函数退出时,这样一个临时变量就会析构,就会解锁。
真是巧妙啊!!!
面向对象真是一门精妙的学问。
我想起了自己曾经定义过一个产生随机数的对象,在构造函数中选取了种子,而防止了每次调用函数都选取种子的结果。
后者因为每次种子都一样,重新产生的随机数都一样。