android c++线程同步,Android C++中线程同步实现

前言

Android C++中的线程同步主要就是对pthread的mutex和condition的封装。所以学习之前,建议先了解一个标准C++中线程同步的实现,参考链接:C++ 中线程学习

Mutex

Android Mutex的实现源码位于/system/core/include/utils/Mutex.h,我们先来看一下Mutex类的具体实现:

class Mutex {

public:

enum {

PRIVATE = 0,

SHARED = 1

};

Mutex();

Mutex(const char* name);

Mutex(int type, const char* name = NULL);

~Mutex();

// lock or unlock the mutex

status_t lock();

void unlock();

// lock if possible; returns 0 on success, error otherwise

status_t tryLock();

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;

};

private:

pthread_mutex_t mMutex;

};

从头文件中,我们发现Mutex类private变量mMutex是我们熟悉的phread_mutex_t类型,pthread_mutex_lock和pthread_mutex_unlock函数通过通过此变量保证一系列操作的原子性。

接下来,我们看一下Mutex类构造函数、析构函数、lock、unlock和tryLock的具体实现(在看源码之前,我们应该能猜到你们就是对pthread _mutex_xxx函数的简单封装):

inline Mutex::Mutex() {

// 构造函数,初始化mMutex变量

pthread_mutex_init(&mMutex, NULL);

}

inline Mutex::~Mutex() {

// 析构函数,就是销毁mMutex变量

pthread_mutex_destory(&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);

}

仅仅是这种简单封装,还不能满足Android设计者偷懒的心理。而且我们在Android源码中大量的看到类似于:

AutoMutex _l(gProcessMutex);

这样的写法,并没有看到Mutex::lock()和Mutex::unlock()的显示调用。所以,接下来,我们继续学习AutoMutex基于Mutex类的实现。

AutoMutex

AutoMutex仅仅是typedef的重命名,源码如下:

typedef Mutex::Autolock AutoMutex;

而Mutex::Autolock是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;

};

可以看到,Autolock内部类在构造函数中调用了Mutex类的lock方法,在析构函数中调用了Mutex类的unlock方法。所以当我们在一个函数块中调用AutoMutex的时候:

Mutex gProcessMutex;

void testAutoMutex() {

AutoMutex _l(gProcessMutex);

// 下面是需要同步的代码内容

// ...

}

我们定义了一个AutoMutex的变量_l,并把Mutex类型的变量gProcessMutex赋值给_l进行构造函数初始化,自然也实现了调用gProcessMutex的lock方法,实现了线程锁机制。

当函数执行完毕后,AutoMutex的析构函数被调用,从而调用了gProcessMutex的unlock方法,释放了线程锁机制。

其实,AutoMutex的机制有点类似于智能指针,都是很好的运用了类的构造函数和析构函数进行一些特定的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值