Android Framework线程封装
首先讲解下Linux下多线程函数及一些简单的概念多线程开发的基本概念包括三点:线程,互斥锁,条件;线程操作又分为线程的创建,退出,等待三种;互斥锁则包括四种操作分别是创建,销毁,加锁和解锁;条件操作有五种操作:创建,销毁,触发,广播和等待。1、创建线程(1)、Linux下 int pthread_create(pthread_t *tid, const pthr
首先讲解下Linux下多线程函数及一些简单的概念
多线程开发的基本概念包括三点:线程,互斥锁,条件;
线程操作又分为线程的创建,退出,等待三种;
互斥锁则包括四种操作分别是创建,销毁,加锁和解锁;
条件操作有五种操作:创建,销毁,触发,广播和等待。
1、创建线程
(1)、Linux下
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void*(*start_routine)(void*),void *arg)
参数说明:第一个参数为线程ID,第二个参数为设置线程属性的,第三个参数为线程运行函数的首地址,第四个参数为所运行函数的参数。
(2)、Android Framework层创建线程封装
//创建线程1
bool createThread(thread_func_t f, void *a)
参数说明:第一个参数为所执行的函数指针,第二个参数为函数所用到的参数指针;
//创建线程2
bool createThreadEtc(thread_func_t entryFunction,void *userData,const char* threadName = "android:unnamed_thread",int32_t threadPriority =
PRIORITY_DEFAULT,size_t threadStackSize = 0,thread_id_t *threadId = 0)
参数说明:第一个参数为线程所执行的函数指针,第二个参数为函数所需要的参数指针,第三个参数为线程名称,第四个参数为线程的
优先级别,第五个参数为线程栈大小,第六个参数为线程ID 号。
• 调用流程图
(3)、AndroidFramework层又封装了Thread类,该类是继承RefBase,所以可以用智能指针调用该线程对象。主要代码所在位置:
threads.h /frameworks/base/include/utils
Threads.cpp /frameworks/base/libs/utils
在Framework层看到的很多线程类都是继承这个Thread类的。
Thread的主要成员变量:
Mutex mLock; //互斥锁
Condition mThreadExitedCondition;//条件变量
bool mExitPending; //退出标志
bool mRunning; //运行标志
• Thread中的主要成员函数:
• Run(); //就是在这个函数中调用Android封装的创建线程函数,这个线程运行的是静态_threadLoop()函数;
• _threadLoop(); //这个函数中有个do while循环,线程未被杀死就一直做这个循环。循环体里面是调用线程的主要函数(即用户可通过继承实现这个函数)threadLoop()函数。所以线程创建启动这个threadLoop()函数至少执行一次,如果它的返回值为True,这个函数将多次执行。
• threadLoop();//该函数为虚函数,用户想要通过线程做哪些工作,就可以在这个函数中实现功能需求。
• exitPending();//函数返回是否退出的标志。
2、互斥锁
引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为"互斥锁“的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
(1)、初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
参数:第一个参数为互斥锁变量,第二个参数为新建互斥锁的属性。
(2)、销毁互斥锁
int pthread_mutex_destroy(pthread_mutex_t *mutex)
参数:互斥锁变量,即释放互斥锁所占的资源
(3)、加锁操作
int pthread_mutex_lock(pthread_mutex_t *mutex)
参数:互斥锁变量
(4)、解锁操作
int pthread_mutex_unlock(pthread_mutex_t *mutex)
参数:互斥锁变量
(5)、尝试加锁
int pthread_mutex_trylock(pthread_mutex_t *mutex)
参数:互斥锁变量,该函数与加锁函数类似,该函数不同的是在锁已经被占据时返回EBUSY,而不是挂起等待。
AndroidFramework层对Linux下的互斥锁对象进行了封装,用一个类Mutex将互斥锁对象所要做的以上操作都封装成这个类中的成员函数,用户想要用互斥锁对象,只要定义一个Mutex对象即可以了。
下面重点讲下 Mutex是如何封装互斥锁对象的。
Mutex类的成员变量和函数 | 说明 |
mMutex | pthread_mutex_t类型 |
构造函数Mutex() | 调用pthread_mutex_init()初始化互斥锁变量mMutex |
加锁函数lock() | 调用pthread_mutex_lock()对互斥锁变量mMutex加锁 |
解锁函数unlock() | 调用pthread_mutex_unlock()对互斥锁变量mMutex解锁 |
测试加锁trylock() | 调用pthread_mutex_lock()对互斥锁变量mMutex试图加锁 |
析构函数~Mutex() | 调用pthread_mutex_lock()销毁互斥锁变量mMutex |
• 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;
};
3、条件变量
条件变量是线程中的东西,就是等待某一条件的发生和信号一样。Linux下条件变量的类型pthread_cond_t;下面先介绍一下条件变量所用到的一些函数:
(1)初始化条件变量
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)
参数:第一个参数为条件变量,第二个参数为条件变量属性设置参数。
(2)、销毁释放条件变量
int pthread_cond_destroy(pthread_cond_t *cv)
说明:释放条件变量cv
(3)、解除在条件变量上的阻塞
int pthread_cond_signal(pthread_cond_t *cv);
说明:函数被用来释放被阻塞在指定条件变量cv上的一个线程。唤醒阻塞在条件变量上的所有线程的顺序由调度策略决定。
(4)、阻塞在条件变量上
int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);
说明:第一个参数为条件变量,第二个参数为互斥锁变量。函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。
(5)、阻塞直到指定时间
int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const structtimespec * abstime);
说明:函数到了一定的时间,即使条件未发生也会解除阻塞。这个时间由参数abstime指定。
(6)、释放阻塞的所有线程
int pthread_cond_broadcast(pthread_cond_t *cv);
说明:函数唤醒所有被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cv被用来指定这个条件变量。
AndroidFramework层将条件变量封装成一个类Condition,上面对于条件变量的操作都放在了这个类的成员函数中了,用户想要使用条件变量可以定义一个Condition对象就行了。
• 下面重点总结下Condition如何对Linux下的条件变量进行封装的。
Condition成员变量和成员函数 | 说明 |
mCond | pthread_cond_t类型 |
构造函数Condition() | 调用函数pthread_cond_init()初始化变量mCond |
触发函数signal() | 调用函数pthread_cond_signal(),参数为mCond |
广播函数broadcast() | 调用pthread_cond_broadcast()函数,参数为mCond |
等待函数wait() | 调用pthread_cond_wait()函数,参数为mCond |
函数waitRelative() | 调用pthread_cond_timedwait()参数为mCond和时间 |
析构函数~Condition() | 调用pthread_cond_destroy()函数,参数为mCond |
更多推荐
所有评论(0)