C++ C++;/boost:如何发出异步任务完成的信号?

C++ C++;/boost:如何发出异步任务完成的信号?,c++,multithreading,c++11,boost,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 });

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

使用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???

使用std::condition_变量:

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);
  }
std::mutexm;
bool task1_done=false;
std::条件变量cond\u var;
pool.enqueue([&cond_var,&task1_done](){
std::this_thread::sleep_for(2s);//任务1
//通知任务1完成
task1_done=真;
cond_var.notify_one();
std::this_thread::sleep_for(2s);//任务2
});
//等待任务1完成
标准:唯一锁(m);
而(!task1_完成){
条件变量等待(锁定);
}

您可以使用互斥并等待


如果您有一个线程池,那么您可以查看该池,该池应该处理依赖项,或者 您应该直接将延续任务与第一个任务链接起来


否则,池可能会死锁。例如,想象一个有1个线程的池。它将无限期地阻塞。如果有足够的任务相互依赖关系,许多线程也会出现同样的情况。

下面回答我自己的问题

我最终使用了一个未来:

  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");
std::打包的_任务task1([](){
std::this_thread::sleep_for(2s);//任务1
返回1;
});
std::future task1result=task1.get_future();
标准::螺纹螺纹1([&](){
task1();
std::this_thread::sleep_for(2s);//任务2
});
int rc1=task1result.get();
printf(“任务1完成:%d\n”,rc1);
thread1.join();
printf(“线程完成\n”);
不,不会出现死锁,因为线程之间没有循环依赖关系(等待的线程不是池的一部分)