public:
enum {
PRIVATE = 0,
SHARED = 1
};
//两种类型:PRIVATE是进程内部使用的;SHARED是适用于跨进程共享的。
//如不指定,缺省是PRIVATE的类型。
Mutex(); //构造函数
Mutex(const char* name); //构造函数
Mutex(int type, const char*name = NULL); //构造函数,type就是上面的那两种类型
~Mutex(); //析构
// lock or unlock the mutex
status_t lock(); //获取锁。如果获取就返回,否则挂起等待
void unlock(); //释放锁
// lock if possible; returns 0 on success,error otherwise
status_t tryLock();
//如果当前锁可被获取(未被别的线程获取)就lock,否则就直接返回。
//返回值:0代表成功;其它值失败。
//与lock()的区别在于不论成功与否都会及时返回,而不是挂起等待。
// Manages the mutex automatically. It’llbe locked when Autolock is
// constructed and released when Autolockgoes out of scope.
//Autolock是为了简化Mutex的使用而定义的,并且充分利用了c++的构造与析构机制
//可以看出,在构造函数中 mLock.lock() 加锁,在析构函数中 mLock.unlock() 解锁。
//所以,对一个需要加锁的函数来说,我们只需要在函数开始处,声明这样 (Mutex::Autolock autolock(mLock)😉,一个变量,它就会加锁,
//等函数退出时,这样一个临时变量就会析构,就会解锁。
android系统里几乎到处都是这种使用,或者AutoMutex _l(mLock)这种使用
//这两种使用是一样的效果的,因为下面有这样一行代码typedefMutex::Autolock AutoMutex;
//这种设计师非常优秀的,如果你手动去lock,unlock,就有可能
//忘了unlock,这样的会很容易死锁,死锁在android系统里后果是非常严重,大多数情况都会系统重启
//大家都知道C++的构造函数析构函数是成对出现的,用了构造函数中 mLock.lock() 加锁,
//在析构函数中 mLock.unlock() 解锁这种设计之后,就不会出现忘了unlock的情况了
class Autolock {
public:
inline Autolock(Mutex& mutex) :mLock(mutex) { mLock.lock(); }
//其实这里不加inline也是没有关系的,在C++里编译器会自动去检查这个函数体
//如果函数体逻辑足够简单,会自动把他当成inline函数,为了养成良好的代码习惯,还是要加上
inline Autolock(Mutex* mutex) :mLock(*mutex) { mLock.lock(); }
inline ~Autolock() { mLock.unlock(); }
private:
Mutex& mLock;
};
private:
friend class Condition; //友元类Condition
// A mutex cannot be copied
Mutex(const Mutex&);
Mutex& operator = (const Mutex&);
#ifdefined(HAVE_PTHREADS)
pthread_mutex_t mMutex;
#else
void _init();
void* mState;
#endif
};
//---------------------------------------------------------------------------
#if defined(HAVE_PTHREADS)
inlineMutex::Mutex() {
pthread_mutex_init(&mMutex, NULL);
}
inlineMutex::Mutex(__attribute__((unused)) const char* name) {<