std::future是C++11引入的一个库特性,用于获取异步操作的结果。它提供了一种机制,通过它可以从另一个线程或异步任务获取值,而不必使用复杂的线程同步技术。std::future通常与std::async、std::promise或std::packaged_task一起使用,用于启动异步任务并在未来某个时刻获取这些任务的结果。 简单介绍- [color=var(--tw-prose-bold)]与std::async一起使用:std::async是一个函数,用于启动一个异步任务,它返回一个std::future对象,通过这个对象可以获取异步操作的结果。
- [color=var(--tw-prose-bold)]与std::promise一起使用:std::promise可以在某个线程中设置一个值或异常,而std::future则用于在另一个线程中获取该值或异常。
- [color=var(--tw-prose-bold)]与std::packaged_task一起使用:std::packaged_task包装一个函数或可调用对象,使其异步执行,并提供一个std::future对象,通过这个对象可以获取被包装函数的返回值。
基本用法以下是一个使用std::async和std::future的简单示例: - #include <iostream>
- #include <future>
- #include <chrono>
- #include <thread> // 包含thread头文件来使用this_thread::sleep_for
- // 一个简单的函数,比如进行一些计算
- int compute(int x) {
- // 假设这个计算需要一些时间
- std::this_thread::sleep_for(std::chrono::seconds(2)); // 使当前线程暂停2秒
- return x * x;
- }
- int main() {
- // 启动异步任务
- std::future<int> result = std::async(std::launch::async, compute, 10);
- // 在等待结果的同时可以做一些其他的事情
- std::cout << "Waiting for the result..." << std::endl;
- // 等待异步任务完成并获取结果
- int value = result.get(); // 注意:调用get()之后,future不能再次使用
- std::cout << "The result is: " << value << std::endl;
- return 0;
- }
複製代碼
这个示例展示了如何启动一个异步任务,并在未来某个时刻获取这个任务的结果。注意,调用std::future::get()方法会阻塞当前线程,直到异步操作完成并且结果可用。一旦调用了get()方法,该future对象就不能再次使用来获取结果。 注意事项- std::future::get()只能被调用一次。调用后,future对象将不再持有任何值。
- 如果异步操作抛出一个异常,该异常会在调用get()时被重新抛出。
- std::async的行为部分取决于传递给它的启动策略参数(例如,std::launch::async或std::launch::deferred)。如果不指定策略,实现选择的策略可能会导致异步操作立即开始,或者延迟到future的get()或wait()被调用时才开始。
编译命令:
- g++ -std=c++11 main.cpp -o main -pthread
複製代碼
|