android中的常见类(二)

Thread类,常见的同步类:Mutex,condition条件类

1.Thread类及常用的同步类

Thread类是android为线程操作而做的一个封装类。在Thread这个类中,创建真实线程的工作是在run函数中完成。

函数代码分析:

Threads.cpp

// 在这个函数中创建工作线程。

Thread::run(const char* name, int32_t priority, size_t stack)

{

......

 if (mCanCallJava) {

res = createThreadEtc(_threadLoop,

                                          this, name, priority, stack, &mThread);

} else {

 res = androidCreateRawThreadEtc(_threadLoop,

                                          this, name, priority, stack, &mThread);

            }

}

分析这个线程创建函数中,要注意两点内容:

(1)mCanCallJava无论是true or flase,最后都是调用androidCreateRawThreadEtc(),完成了对于真实线程的创建任务,就是说此时有了可以工作的线程。

(2)mCanCallJava == true时,会实现线程跟androidruntime的关联。通过,androidruntime:: startReg()函数的调用,进一步使得androidCreateRawThreadEtc()成功进入到javaThreadShell函数的调用中,javaThreadShell会实现跟JNI环境的关联,即attach到JNI环境中,此时这个线程就可以很方便的调用JNI的函数了。

结论:

就是说由于mCanCallJava == true的关系,完成的任务是在实现创建真实线程之间,把这个关系先跟JNI环境联系起来,这样做的目的是之后创建好的thread可以很好的自由使用JNI函数。第二,这个创建好的thread推出后会从JNI环境中dettach,实现释放资源的功能。这个第二点中还起到了保护dalvik的功效,因为JNI环境下做的dettach工作之后,被dalvik检查到,就不会做abort。

2. 常见的同步类

android中常用的是有3种分装好的同步类,Mutex,Conditon,和简单的原子操作。

(1)Mutex

三个方面要关注

首先是初始化

其次,是lock(),表示要为临界资源上锁,这时候临界资源可以被你使用,其他要等待你对资源的释放信号,即unlock信号。

最后,使用完了临界资源之后,告知其他人unloock(),可以使用资源了。

其中,一个小问题是,tryLock()只是尝试要锁,必须根据返回值判断是否锁住。

(1.2)要说的是自动锁AutoLock类,它是Mutex的内部类,完成的是将AutoLock显示调用lock(),unlock()的封装,放到它自己的构造和析构中,此时可以直接触发这两个函数。

具体使用:

先定义一个Mutex类对象,在使用这个类对象的时候定义一个AutoLock.

Mutex xLock;

AutoLock autoLock(xLock);

这样就可以了.

 (2)condition条件类

明确多线程同步中,条件类是如何使用的;

     线程A,完成后接着线程B才能完成,就是说,B必须等待A完成后才能开始,所以加上一个条件,即使用这个条件类condition,这个条件类对象成立时,这样B线程开始工作,就这样。

 具体是这样工作的:

线程A完成工作后接着会触发这个条件,这时,受条件限制的B线程就被唤醒,这时B就可以工作了。此时A称之为触发者,而B来说就是等待者。

class condition{

};

的定义也是比较简单的,其中主要的函数说明:

.wait():wait(Mutex & mutex),这个wait的含义是和B保持一致的,Mutex & mutex是表示的A的情况,mutex.unLock()的时候这个等待函数会被触发,这时候

void signal()出来了,说明条件满足啦,B可以开始工作了,void broadcast()通知出去,工作完成。

 

注意condition的使用:

class condition中的所有成员函数必须放在一个Mutex的lock和unlock范围之内,只是强制性的。

以Threads::requestExitAndWait() 函数为例。

这个函数的功能是等待工作线程的退出。

假设这样一种情况,当前工作线程退出之后,即A完成工作,正常退出之后,B收到后就开始进行工作。这时候condition是在requestExitAndWait()中工作的。当这个当前工作线程A正常退出前先condition.wait(),这样没有了后顾之忧,接着B就能及时工作了。

描述完毕。

 (3)

原子操作:就是说在该操作执行完之前绝对不会被其他任务打断。即,原子操作是最小的执行单位。正式由于这样的原因,原子操作避免了锁的使用,更简洁。

你可能感兴趣的:(Thread类,android中的常见类二,condition条件类,常见的同步类Mutex)