Mutex

来源:互联网 发布:xmarks的替代品 知乎 编辑:程序博客网 时间:2024/05/18 01:48
inline Mutex::Mutex(int type, const char* name) {
    if (type == SHARED) {
       //type如果是SHARED,则表明这个Mutex支持跨进程的线程同步。
      //以后我们在Audio系统和Surface系统中会经常见到这种用法。
        pthread_mutexattr_t attr;
        pthread_mutexattr_init(&attr);
        pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
        pthread_mutex_init(&mMutex, &attr);
        pthread_mutexattr_destroy(&attr);
    } else {
        pthread_mutex_init(&mMutex, NULL);
    }
}
inline Mutex::~Mutex() {
    pthread_mutex_destroy(&mMutex);
}
inline status_t Mutex::lock() {
    return -pthread_mutex_lock(&mMutex);
}
inline void Mutex::unlock() {
    pthread_mutex_unlock(&mMutex);
}
inline status_t Mutex::tryLock() {
    return -pthread_mutex_trylock(&mMutex);
}
AudioEffectShared.h中
effect_param_cblk_t() : lock(Mutex::SHARED), clientIndex(0), serverIndex(0) {}

AutoLock类是定义在Mutex内部的一个类,AutoLock的用法很简单:
先定义一个Mutex,如 Mutex xlock
在使用xlock的地方,定义一个AutoLock,如 AutoLock autoLock(xlock)

    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;
    };
现在的使用更简单:
Mutex::Autolock _l(mLock);
0 0