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_);
 }