以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线程
加到线程池中。