C++异步编程简介
\n\n在现代软件开发中,应用程序的性能和响应能力起着关键作用。C++中的异步编程允许高效利用系统资源,在不阻塞主线程的情况下同时执行多个任务。这在处理网络请求、输入输出操作和长时间计算时尤为重要。
\n\n与传统的同步方法(每个操作按顺序执行)不同,异步代码可以在后台启动任务,并在结果准备好时获取它们。在本指南中,我们将介绍C++异步编程的基本工具,从简单概念开始,一直到C++20标准的现代功能。
\n\n异步基础:std::async 和 std::future
\n\n在C++中开始异步编程的最简单方法是使用 std::async。该函数异步启动一个任务,并返回一个包含执行结果的 std::future 对象。
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#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。这些工具允许在线程之间传递值并包装可调用对象。
使用 std::promise
\n\nstd::promise 允许设置一个值,随后通过相应的 std::future 对象获取该值:
#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