如何解决gRPC DynamicThreadPool可以并行执行任务吗?
在gRPC C ++源代码中,其线程函数 DynamicThreadPool :: DynamicThread :: ThreadFunc()在每个线程中执行。但是此函数调用属于线程池的 DynamicThreadPool :: ThreadFunc()。在 DynamicThreadPool :: ThreadFunc()中,在执行一些工作之前,它将先调用 grpc_core :: ReleasableMutexLock lock(&mu _)进行锁定。因此,似乎线程池中的任务总是按顺序执行。我会误会吗?如果没有,使用多线程有什么好处?
void DynamicThreadPool::DynamicThread::ThreadFunc() {
pool_->ThreadFunc();
// Now that we have killed ourselves,we should reduce the thread count
grpc_core::MutexLock lock(&pool_->mu_);
pool_->nthreads_--;
// Move ourselves to dead list
pool_->dead_threads_.push_back(this);
if ((pool_->shutdown_) && (pool_->nthreads_ == 0)) {
pool_->shutdown_cv_.Signal();
}
}
void DynamicThreadPool::ThreadFunc() {
for (;;) {
// Wait until work is available or we are shutting down.
grpc_core::ReleasableMutexLock lock(&mu_);
if (!shutdown_ && callbacks_.empty()) {
// If there are too many threads waiting,then quit this thread
if (threads_waiting_ >= reserve_threads_) {
break;
}
threads_waiting_++;
cv_.Wait(&mu_);
threads_waiting_--;
}
// Drain callbacks before considering shutdown to ensure all work
// gets completed.
if (!callbacks_.empty()) {
auto cb = callbacks_.front();
callbacks_.pop();
lock.Unlock();
cb();
} else if (shutdown_) {
break;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。