C++when_all并发等待多个协程
使用 C++ 的 when_all 并发等待多个协程
在现代软件开发中,处理多个任务并行执行是一个常见的需求。C++ 提供了强大的异步编程支持,其中 std::experimental::coroutine 和 std::experimental::future 是实现并发的关键工具之一。本文将介绍如何使用 when_all 来并发等待多个协程,并提供具体的代码示例。
什么是 when_all
when_all 是 C++ 标准库中的一个函数,用于并发等待多个 std::future 对象。它接受一个可迭代对象(如 std::vector 或 std::array)作为参数,并返回一个新的 std::future 对象,该对象会在所有传入的 std::future 对象都完成时才完成。
实现并发等待多个协程
假设我们有一个简单的协程函数,它模拟了一个耗时操作:

#include <iostream>
#include <future>
#include <thread>
// 模拟一个耗时操作
std::future<int> async_task(int id) {
std::promise<int> promise;
auto future = promise.get_future();
std::thread([id, &promise]() {
std::this_thread::sleep_for(std::chrono::seconds(id));
promise.set_value(id);
}).detach();
return future;
}
我们可以使用 when_all 来并发等待多个这样的协程:
#include <iostream>
#include <vector>
#include <future>
#include <algorithm>
int main() {
std::vector<std::future<int>> futures;
// 创建多个协程
for (int i = 1; i <= 5; ++i) {
futures.push_back(async_task(i));
}
// 并发等待所有协程完成
std::future<void> all_futures = std::async(std::launch::async, [&futures]() {
std::for_each(futures.begin(), futures.end(), [](auto& f) {
f.wait();
});
});
// 获取所有结果
std::vector<int> results;
for (auto& future : futures) {
results.push_back(future.get());
}
// 输出结果
for (const auto& result : results) {
std::cout << "Task " << result << " completed\n";
}
return 0;
}
在这个示例中,我们创建了五个协程,并使用 when_all 来并发等待它们完成。每个协程模拟了一个耗时操作,并在完成后将结果存储在一个 std::future 对象中。通过 std::async 函数,我们将等待所有协程完成的操作放在一个单独的线程中执行。
总结
使用 when_all 可以有效地并发等待多个协程,并且可以显著提高程序的性能。通过结合 std::future 和 std::async,我们可以轻松地实现复杂的并发任务。希望这个示例能帮助你更好地理解和应用 C++ 中的并发编程技术。
文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。


还没有评论,来说两句吧...