C++异步编程:初学者完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++异步编程简介

\n\n

在现代软件开发中,应用程序的性能和响应能力起着关键作用。C++中的异步编程允许高效利用系统资源,在不阻塞主线程的情况下同时执行多个任务。这在处理网络请求、输入输出操作和长时间计算时尤为重要。

\n\n

与传统的同步方法(每个操作按顺序执行)不同,异步代码可以在后台启动任务,并在结果准备好时获取它们。在本指南中,我们将介绍C++异步编程的基本工具,从简单概念开始,一直到C++20标准的现代功能。

\n\n

异步基础:std::async 和 std::future

\n\n

在C++中开始异步编程的最简单方法是使用 std::async。该函数异步启动一个任务,并返回一个包含执行结果的 std::future 对象。

\n\n

std::async 基本示例

\n\n
#include <iostream>\n#include <future>\n#include <chrono>\n\nint long_operation() {\n    std::this_thread::sleep_for(std::chrono::seconds(2));\n    return 42;\n}\n\nint main() {\n    std::cout << "启动异步任务..." << std::endl;\n    \n    // 启动异步任务\n    std::future<int> result = std::async(std::launch::async, long_operation);\n    \n    std::cout << "主线程继续工作..." << std::endl;\n    \n    // 获取结果(阻塞线程直到就绪)\n    int value = result.get();\n    std::cout << "结果: " << value << std::endl;\n    \n    return 0;\n}
\n\n

启动策略 std::launch::async 确保函数在单独的线程中执行。另一种选择是 std::launch::deferred,它将执行推迟到调用 get() 时。

\n\n

处理多个任务

\n\n

异步编程在并行执行多个独立任务时特别有效:

\n\n
#include <iostream>\n#include <future>\n#include <vector>\n\nint compute_square(int x) {\n    return x * x;\n}\n\nint main() {\n    std::vector<std::future<int>> tasks;\n    \n    // 启动多个异步任务\n    for (int i = 1; i <= 5; ++i) {\n        tasks.push_back(std::async(std::launch::async, compute_square, i));\n    }\n    \n    // 收集结果\n    for (auto& task : tasks) {\n        std::cout << "结果: " << task.get() << std::endl;\n    }\n    \n    return 0;\n}
\n\n

高级工具:std::promise 和 std::packaged_task

\n\n

为了更灵活地管理C++中的异步操作,提供了 std::promise 和 std::packaged_task。这些工具允许在线程之间传递值并包装可调用对象。

\n\n

使用 std::promise

\n\n

std::promise 允许设置一个值,随后通过相应的 std::future 对象获取该值:

\n\n
#include <iostream>\n#include <future>\n#include <thread>\n\nvoid producer_thread(std::promise<std::string> promise) {\n    try {\n        std::string data = "来自线程的重要数据";\n        // 设置值\n        promise.set_value(data);\n    } catch(...) {\n        // 异常处理\n        promise.set_exception(std::current_exception());\n    }\n}\n\nint main() {\n    std::promise<std::string> promise;\n    std::future<std::string> future = promise.get_future();\n    \n    std::thread thread(pro                

博客

书籍推荐