Switch to futures
diff --git a/gdb/gdbsupport/parallel-for.h b/gdb/gdbsupport/parallel-for.h
index 6f4235d..11af33d 100644
--- a/gdb/gdbsupport/parallel-for.h
+++ b/gdb/gdbsupport/parallel-for.h
@@ -68,9 +68,7 @@
     parallel_for_pool.start (n_threads);
   }
 
-  std::mutex mtx;
-  std::condition_variable cv;
-  int num_finished = 0;
+  std::future<void> futures[n_threads];
 
   size_t n_elements = last - first;
   if (n_threads > 1 && 2 * n_threads <= n_elements)
@@ -79,12 +77,9 @@
       for (int i = 0; i < n_threads; ++i)
 	{
 	  RandomIt end = first + elts_per_thread;
-	  parallel_for_pool.post_task ([&, first, end] () {
-				       callback (first, end);
-				       std::unique_lock<std::mutex> lck (mtx);
-				       num_finished++;
-				       cv.notify_all ();
-				       });
+	  futures[i] = parallel_for_pool.post_task ([&, first, end] () {
+						     callback (first, end);
+						     });
 	  first = end;
 	}
     }
@@ -94,15 +89,10 @@
 
   /* Process all the remaining elements in the main thread.  */
   callback (first, last);
-  if (n_threads)
-    {
-      for (;;) {
-	std::unique_lock<std::mutex> lck (mtx);
-	if (num_finished == n_threads)
-	  break;
-	cv.wait (lck);
-      }
-    }
+#ifdef CXX_STD_THREAD
+  for (size_t i = 0; i < n_threads; ++i)
+    futures[i].wait ();
+#endif /* CXX_STD_THREAD */
 }
 
 }
diff --git a/gdb/gdbsupport/thread_pool.c b/gdb/gdbsupport/thread_pool.c
index 03fef95..a78edea 100644
--- a/gdb/gdbsupport/thread_pool.c
+++ b/gdb/gdbsupport/thread_pool.c
@@ -40,7 +40,7 @@
 	  break;
 	if (m_tasks.empty ())
 	  continue;
-	t = m_tasks.front();
+	t = std::move (m_tasks.front());
 	m_tasks.pop();
       }
       t ();
diff --git a/gdb/gdbsupport/thread_pool.h b/gdb/gdbsupport/thread_pool.h
index 77760a9..9717263 100644
--- a/gdb/gdbsupport/thread_pool.h
+++ b/gdb/gdbsupport/thread_pool.h
@@ -8,6 +8,7 @@
 #include <atomic>
 #include <mutex>
 #include <condition_variable>
+#include <future>
 
 namespace gdb {
 
@@ -20,11 +21,14 @@
 
   void start(size_t num_threads);
 
-  typedef std::function<void ()> task;
-  void post_task(task t) {
+  typedef std::packaged_task<void()> task;
+  std::future<void> post_task(std::function<void ()> func) {
+    task t(func);
+    std::future<void> f = t.get_future();
     std::lock_guard<std::mutex> guard (m_tasks_mutex);
-    m_tasks.push (t);
+    m_tasks.push (std::move (t));
     m_tasks_cv.notify_one ();
+    return f;
   }
 
  private: