diff --git a/include/grpc++/dynamic_thread_pool.h b/include/grpc++/dynamic_thread_pool.h index 7519a47726c7d65a5a1a45bb480bbb5980dfedf5..e01063ced2351b66eec74f9c9cdaed1ab633d0db 100644 --- a/include/grpc++/dynamic_thread_pool.h +++ b/include/grpc++/dynamic_thread_pool.h @@ -64,6 +64,7 @@ class DynamicThreadPool GRPC_FINAL : public ThreadPoolInterface { }; grpc::mutex mu_; grpc::condition_variable cv_; + grpc::condition_variable shutdown_cv_; bool shutdown_; std::queue<std::function<void()>> callbacks_; int reserve_threads_; diff --git a/src/cpp/server/dynamic_thread_pool.cc b/src/cpp/server/dynamic_thread_pool.cc index bc0d16f170488aa83f1783efdc0b248d2cf86adc..c42563103c6f1a5561ed21676b11c9eba808e505 100644 --- a/src/cpp/server/dynamic_thread_pool.cc +++ b/src/cpp/server/dynamic_thread_pool.cc @@ -58,6 +58,9 @@ void DynamicThreadPool::DynamicThread::ThreadFunc() { pool_->dead_threads_.push_back(this); } } + if ((pool_->shutdown_) && (pool_->nthreads_ == 0)) { + pool_->shutdown_cv_.notify_one(); + } } void DynamicThreadPool::ThreadFunc() { @@ -103,12 +106,12 @@ void DynamicThreadPool::ReapThreads(std::list<DynamicThread*>* tlist) { } DynamicThreadPool::~DynamicThreadPool() { - { - grpc::lock_guard<grpc::mutex> lock(mu_); - shutdown_ = true; - cv_.notify_all(); + grpc::unique_lock<grpc::mutex> lock(mu_); + shutdown_ = true; + cv_.notify_all(); + while (nthreads_ != 0) { + shutdown_cv_.wait(lock); } - ReapThreads(&live_threads_); ReapThreads(&dead_threads_); }