首先讲解下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

 

Logo

更多推荐