C++ C++;/boost:如何发出异步任务完成的信号?
我有一个线程池,它异步执行任务。但我需要等待某个任务完成后才能继续(不允许在当前线程中运行该任务,该任务必须由工作线程运行) 使用C++11或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 });
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”);
不,不会出现死锁,因为线程之间没有循环依赖关系(等待的线程不是池的一部分)