startThreadPool,joinThreadPool 都在做什么

以main_mediaserver.cpp文件中的main()函数为例子,记录一下startThreadPool函数和joinThreadPool函数都在做什么

ProcessState::self()->startThreadPool();/*创建线程并加入到线程池中*/

        IPCThreadState::self()->joinThreadPool();/*把主线程加入到线程池中*/


解释下面一句:

ProcessState::self()->startThreadPool();

先说ProcessState::self(), ProcessState::self()的定义如下

sp<ProcessState> ProcessState::self()
{
    Mutex::Autolock _l(gProcessMutex);
    if (gProcess != NULL) {
        return gProcess;
    }
    gProcess = new ProcessState;
    return gProcess;
}

这里其实就是返回gProcess这个全局变量的值。

gProcess变量声明是sp<ProcessState> gProcess,gProcess就是sp类的对象。

这个变量声明会调用class sp的构造函数,但看代码sp的构造函数就是把类里边的m_ptr变量清零。m_ptr变量的类型根据<typename>可以知道,

应该就是指向ProcessState的指针。

在上面函数中 gProcess = new ProcessState; 这个语句,相当于sp<ProcessState> gProcess(new ProcessState),

根据sp模板类的定义,sp<ProcessState> gProcess(new ProcessState)这个一句会调用如下

template<typename T>
sp<T>& sp<T>::operator = (T* other)
{
    if (other) other->incStrong(this);
    if (m_ptr) m_ptr->decStrong(this);
    m_ptr = other;
    return *this;
}

先不考虑incStrong()和decStrong()的话,这个函数做的事情无非就是把一个指向ProcessState的指针赋值给m_ptr。前面已经说过m_ptr的类型

就是ProcessState的指针。

最后再说ProcessState::self()->startThreadPool() 这一句,ProcessState::self()返回的gProcessState变量,其实是个sp的对象,

怎么可以调用ProcessState的startThreadPool() 函数呢? 

这是因为在sp类中已经有了对 -> 的操作符重载。

inline  T*      operator-> () const { return m_ptr;  }

所以ProcessState::self()-> 这个其实就是返回m_ptr,也就是ProcessState类的对象指针,所以ProcessState::self()->startThreadPool() 就是调用

ProcessState的startThreadPool() 函数。


在main_mediaserver.cpp文件中,startThreadPool()调用是在fork()启动了一个子进程之后在子进程的上下文中调用的,其实就是再起一个子进程的

线程,并起名叫Binder_X。那么来看一下ProcessState::self()->startThreadPool()函数的调用过程。

前面已经讲过 ProcessState::self()->返回的是ProcessState的对象指针,所以startThreadPool()应该就是调用ProcessState::startThreadPool()函数。

看进去最终调用的是spawnPooledThread()函数,再调用Thread::run()函数。

spawnPooledThread()函数定义如下

void ProcessState::spawnPooledThread(bool isMain)
{
    if (mThreadPoolStarted) {
        String8 name = makeBinderThreadName();
        ALOGV("Spawning new pooled thread, name=%s\n", name.string());
        sp<Thread> t = new PoolThread(isMain);
        t->run(name.string());
    }
}

在调用spawnPooledThread()函数的时候传的参数是true,所以Thread::run()调用

createThreadEtc()函数来起一个线程,那线程函数自然就是_threadLoop()函数。

Thread::_threadLoop(void* user) {

....

Thread* const self = static_cast<Thread*>(user);

....

result = self->threadLoop();

}

虽然self->thraedLoop()看似是调用的Thread类的threadLoop()函数,但Thread类里threadLoop()函数是虚函数,

createThreadEtc()函数调用的时候传进去的this是ProcessState类的指针。所以根据多态原理,这里调用的是PoolThread::threadLoop()函数。

PoolThread::threadLoop()定义如下:

  virtual bool threadLoop()
    {
        IPCThreadState::self()->joinThreadPool(mIsMain);
        return false;
    }

这里我们可以看到 ProcessState::self()->startThreadPool()不仅用来创建binder_x线程,还会调用joinTHreadPool()函数把binder_x线程

加到线程池中。




你可能感兴趣的:(startThreadPool,joinThreadPool 都在做什么)