startThreadPool调用流程

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

1、startThreadPool()的主要作用是:(ProcessState.cpp)
调用spawnPooledThread(  true )

2、spawnPooledThread这个函数里面主要作用是:(ProcessState.cpp)
启动一个线程sp<Thread> t =  new  PoolThread(isMain);
t->run(buf);        //最终就会执行PoolThread类的threadLoop函数了。

3、PoolThread继承自Thread,里面有个run函数,主要作用是:(system\core\libutils\Threads.cpp)
调用函数createThreadEtc 或 androidCreateRawThreadEtc 创建线程_threadLoop

4、_threadLoop里面主要作用是:(system\core\libutils\Threads.cpp)
调用自己的threadLoop(self->threadLoop()),就是2步骤中的PoolThread里面的一个函数threadLoop()

5、threadLoop()函数里面主要作用是:(ProcessState.cpp)
调用IPCThreadState::self()->joinThreadPool(mIsMain),mIsMain第一次是true,代表主线程

6、用户线程被创建后,调用joinThreadPool:
IPCThreadState::self()->joinThreadPool(mIsMain)

joinThreadPool函数主要作用是:(IPCThreadState.cpp)
调用talkWithDriver(),其中会调用ioctl(mProcess->mDriverFD, BINDER_WRIT

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Android 系统中,`ProcessState::self()->startThreadPool()` 用于启动 Binder 线程池服务,而 `IPCThreadState::self()->joinThreadPool()` 则是让当前线程加入到 Binder 线程池中。如果一个 HAL service 没有调用 `ProcessState::self()->startThreadPool()`,但是调用了 `IPCThreadState::self()->joinThreadPool()`,那么该 HAL service 就会试图将当前线程加入到不存在的线程池中,这会导致运行时错误。因此,HAL service 在启动时应该始终调用 `ProcessState::self()->startThreadPool()` 来启动 Binder 线程池服务,以便正确地加入到 Binder 线程池中。 ### 回答2: 如果一个 HAL 服务没有调用 `ProcessState::self()->startThreadPool()`,而只调用了 `IPCThreadState::self()->joinThreadPool()`,可能出现以下情况: 1. HAL 服务是在其他进程中运行的:`ProcessState::self()->startThreadPool()` 用于在当前进程中启动线程池,而 `IPCThreadState::self()->joinThreadPool()` 用于加入现有的线程池。所以如果一个 HAL 服务运行在其他进程中,它只需要加入已经被其他服务启动的线程池即可。 2. HAL 服务是在单线程环境下运行的:在某些情况下,HAL 服务可能是在单线程环境中运行的,不需要多线程支持。此时,并不需要调用 `ProcessState::self()->startThreadPool()` 来启动线程池,只需调用 `IPCThreadState::self()->joinThreadPool()` 即可将服务加入到当前进程的单一线程池中。 总之,只调用 `IPCThreadState::self()->joinThreadPool()` 而不调用 `ProcessState::self()->startThreadPool()` 可能是由于 HAL 服务运行在其他进程中,或者 HAL 服务是在单线程环境中运行的,不需要启动额外的线程池。这种情况下,服务只需加入已存在的线程池即可。 ### 回答3: 在某些情况下,hal service没有调用ProcessState::self()->startThreadPool(),只调用IPCThreadState::self()->joinThreadPool(),主要是因为这个hal service不需要创建自己的线程池。 在Android系统中,HAL(Hardware Abstraction Layer)服务提供了与硬件交互的接口。通常情况下,HAL服务中会涉及到与硬件设备进行通信的操作,比如传感器、摄像头等。为了保证这些HAL服务可以并行运行,Android框架提供了多线程机制。 在HAL服务的实现中,ProcessState::self()->startThreadPool()用于创建一个线程池,并启动多个线程来并行处理来自客户端的请求。而IPCThreadState::self()->joinThreadPool()则会将当前线程加入到线程池中,并等待处理来自客户端的请求。 但是,并不是所有的HAL服务都需要自己的线程池。有些HAL服务可能只需要在调用时等待客户端的请求,而不需要并行处理。对于这种情况,就不需要调用ProcessState::self()->startThreadPool(),只需调用IPCThreadState::self()->joinThreadPool()加入到现有的线程池中即可。 总结来说,如果一个HAL服务没有调用ProcessState::self()->startThreadPool(),只调用了IPCThreadState::self()->joinThreadPool(),那说明这个HAL服务只是简单地等待处理客户端的请求,而不需要额外的线程池来进行并行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值