C ++ / boost:如何表示异步任务完成?

时间:2016-01-27 14:13:18

标签: c++ multithreading c++11 boost

我有一个线程池,可以异步执行任务。但是我需要等待某个任务完成才能继续(不允许在当前线程中运行任务,任务必须由工作线程运行)。

使用C ++ 11或Boost实现此目的的最简单方法是什么?

  pool.enqueue([]() {
    std::this_thread::sleep_for(2s); // task 1
    // notify task 1 completion???
    std::this_thread::sleep_for(2s); // task 2
  });
  // wait until task 1 is complete???

4 个答案:

答案 0 :(得分:1)

如果您有一个线程池,则池应该处理依赖项或 你应该直接从第一个任务链接延续任务。

否则,池可能会死锁。想象一下,例如一个带有1个线程的池。它会无限期地阻止。在给定足够的任务依赖性的情况下,许多线程也会发生同样的情况。

答案 1 :(得分:0)

使用std :: condition_variable:

std::mutex m;
bool task1_done=false;
std::condition_variable cond_var;
  pool.enqueue([&cond_var, &task1_done]() {
    std::this_thread::sleep_for(2s); // task 1
    // notify task 1 completion
    task1_done=true;
    cond_var.notify_one();
    std::this_thread::sleep_for(2s); // task 2
  });

  // wait until task 1 is complete
  std::unique_lock<std::mutex> lock(m);
  while( !task1_done ) {
    cond_var.wait(lock);
  }

答案 2 :(得分:0)

您可以使用互斥锁和wait_for / wait_until

您可以查看example

答案 3 :(得分:0)

回答我自己的问题。

我最终使用了未来:

  std::packaged_task<int()> task1([]() {
    std::this_thread::sleep_for(2s); // task 1
    return 1;
  });
  std::future<int> task1result = task1.get_future();
  std::thread thread1([&]() {
    task1();
    std::this_thread::sleep_for(2s); // task 2
  });
  int rc1 = task1result.get();
  printf("task1 complete: %d\n", rc1);
  thread1.join();
  printf("thread complete\n");

不,不存在死锁的可能,因为线程之间没有循环依赖(等待线程不是池的一部分)。