我有一个线程池,可以异步执行任务。但是我需要等待某个任务完成才能继续(不允许在当前线程中运行任务,任务必须由工作线程运行)。
使用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???
答案 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");
不,不存在死锁的可能,因为线程之间没有循环依赖(等待线程不是池的一部分)。