C++when_all并发等待多个协程

2026-04-02 09:55:15 644阅读 0评论

使用 C++ 的 when_all 并发等待多个协程

在现代软件开发中,处理多个任务并行执行是一个常见的需求。C++ 提供了强大的异步编程支持,其中 std::experimental::coroutinestd::experimental::future 是实现并发的关键工具之一。本文将介绍如何使用 when_all 来并发等待多个协程,并提供具体的代码示例。

什么是 when_all

when_all 是 C++ 标准库中的一个函数,用于并发等待多个 std::future 对象。它接受一个可迭代对象(如 std::vectorstd::array)作为参数,并返回一个新的 std::future 对象,该对象会在所有传入的 std::future 对象都完成时才完成。

实现并发等待多个协程

假设我们有一个简单的协程函数,它模拟了一个耗时操作:

C++when_all并发等待多个协程

#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::futurestd::async,我们可以轻松地实现复杂的并发任务。希望这个示例能帮助你更好地理解和应用 C++ 中的并发编程技术。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
验证码
评论列表 (暂无评论,644人围观)

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

目录[+]