3.锁没有锁函数调用,都是对本象中元素进行处理,吐给外层。
std::unique_ptr<Task> TaskQueue::GetNext() {
for (;;) {
{
base::LockGuard<base::Mutex> guard(&lock_);
if (!task_queue_.empty()) {
std::unique_ptr<Task> result = std::move(task_queue_.front());
task_queue_.pop();
return result;
}
if (terminated_) {
process_queue_semaphore_.Signal();
return nullptr;
}
}
process_queue_semaphore_.Wait();
}
}
4.最终退出时,会把所有投递的Task干完。当没有任务,又置为结束时,会process_queue_semaphore_.Signal() 接力传递下去,然后本线程退出。
当DefaultWorkerThreadsTaskRunner::Terminate() 时,queue_.Terminate(),会给信号量+1,然后每个线程在退出时,会继续接力+1。