关于C++层Thread的threadLoop的问题

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

相关类
Threads.cpp
threads.h
Thread.h

在C++层的输入处理类中碰到一个线程相关的问题
1:InputReaderThread读取线程及InputDispatcherThread派发线程是如何去执行threadLoop方法的?
2:事件读取及派发线程肯定是一个循环线程,因为它要持续的接收并派发驱动层的触摸事件,threadLoop如何循环?

在Native层实现一个Thread类的派生类,Thread中有一个虚方法,派生类需实现

virtual bool        threadLoop()

在实现该方法时,注意以下规则
当返回true时,如果requestExit没有被调用,则threadLoop会再次调用
当返回false时,线程退出

Thread的run方法主要功能是在C层创建线程

if (mCanCallJava) {
      res = createThreadEtc(_threadLoop, this, name, priority, stack, &mThread);
} else {
      res = androidCreateRawThreadEtc(_threadLoop, this, name, priority, stack, &mThread);
}

当mCanCallJava是true时,createThreadEtc定义在AndroidThreads.h中的内联函数,调用androidCreateThreadEtc

int androidCreateThreadEtc(android_thread_func_t entryFunction,
                            void *userData,
                            const char* threadName,
                            int32_t threadPriority,
                            size_t threadStackSize,
                            android_thread_id_t *threadId)
{
    return gCreateThreadFn(entryFunction, userData, threadName,threadPriority, threadStackSize, threadId);
}

gCreateThreadFn默认时等于androidCreateRawThreadEtc
当mCanCallJava是false时,调用androidCreateRawThreadEtc,创建线程

int result = pthread_create(&thread, &attr,(android_pthread_entry)entryFunction, userData);

pthread_create是Linux创建线程的方法,并执行entryFunction,对应的是_threadLoop
综上,在Thread类的run方法执行后,会调用底层库libpthread的方法pthread_create创建线程,并执行回调方法_threadLoop。

_threadLoop控制threadLooper的循环

do {
        bool result;
        if (first) {
            first = false;
            self->mStatus = self->readyToRun();
            result = (self->mStatus == NO_ERROR);
            if (result && !self->exitPending()) {
                result = self->threadLoop();
            }
        } else {
            result = self->threadLoop();
        }

        {
        Mutex::Autolock _l(self->mLock);
        if (result == false || self->mExitPending) {//当result 为false或者result 为true且mExitPending时,退出循环,退出线程
            self->mExitPending = true;
            self->mRunning = false;
           
            self->mThread = thread_id_t(-1);
       
            self->mThreadExitedCondition.broadcast();
            break;
        }
        }

        strong.clear(); 
        strong = weak.promote();
    } while(strong != 0);

threadLooper派生类返回true,可实现线程循环执行threadLooper方法

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

你可能感兴趣的:(关于C++层Thread的threadLoop的问题)