您好,登录后才能下订单哦!
在现代C++编程中,异步编程是一个非常重要的概念。C++11引入了std::future
和std::promise
等工具,使得异步编程变得更加简单和直观。本文将详细介绍std::future
的使用方法,并通过示例代码帮助读者更好地理解其工作原理。
std::future
是C++11标准库中的一个模板类,用于表示一个异步操作的结果。它允许我们在一个线程中启动一个异步任务,并在另一个线程中获取该任务的结果。std::future
通常与std::async
、std::promise
或std::packaged_task
一起使用。
std::async
是一个函数模板,用于启动一个异步任务,并返回一个std::future
对象,该对象可以用来获取任务的结果。
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int compute() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
int main() {
std::future<int> fut = std::async(std::launch::async, compute);
std::cout << "Waiting for the result...\n";
int result = fut.get();
std::cout << "Result: " << result << "\n";
return 0;
}
在这个例子中,std::async
启动了一个异步任务compute
,并返回一个std::future<int>
对象fut
。fut.get()
会阻塞当前线程,直到compute
函数返回结果。
std::promise
是另一个可以与std::future
配合使用的类。std::promise
允许我们在一个线程中设置一个值,并在另一个线程中通过std::future
获取该值。
#include <iostream>
#include <future>
#include <thread>
void compute(std::promise<int> prom) {
std::this_thread::sleep_for(std::chrono::seconds(2));
prom.set_value(42);
}
int main() {
std::promise<int> prom;
std::future<int> fut = prom.get_future();
std::thread t(compute, std::move(prom));
std::cout << "Waiting for the result...\n";
int result = fut.get();
std::cout << "Result: " << result << "\n";
t.join();
return 0;
}
在这个例子中,std::promise<int>
对象prom
用于在compute
函数中设置值,而prom.get_future()
返回的std::future<int>
对象fut
用于在主线程中获取该值。
std::packaged_task
是一个类模板,用于将可调用对象(如函数、lambda表达式等)包装成一个异步任务,并返回一个std::future
对象。
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int compute() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
int main() {
std::packaged_task<int()> task(compute);
std::future<int> fut = task.get_future();
std::thread t(std::move(task));
std::cout << "Waiting for the result...\n";
int result = fut.get();
std::cout << "Result: " << result << "\n";
t.join();
return 0;
}
在这个例子中,std::packaged_task<int()>
对象task
包装了compute
函数,并通过task.get_future()
返回一个std::future<int>
对象fut
。std::thread
对象t
启动任务,并在主线程中通过fut.get()
获取结果。
std::future
提供了几个方法来检查异步任务的状态:
valid()
:检查std::future
对象是否与一个共享状态相关联。wait()
:阻塞当前线程,直到异步任务完成。wait_for()
:阻塞当前线程一段时间,直到异步任务完成或超时。wait_until()
:阻塞当前线程,直到异步任务完成或到达指定时间点。#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int compute() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
int main() {
std::future<int> fut = std::async(std::launch::async, compute);
if (fut.valid()) {
std::cout << "Future is valid.\n";
}
std::future_status status = fut.wait_for(std::chrono::seconds(1));
if (status == std::future_status::ready) {
std::cout << "Task completed.\n";
} else if (status == std::future_status::timeout) {
std::cout << "Task is still running.\n";
}
int result = fut.get();
std::cout << "Result: " << result << "\n";
return 0;
}
在这个例子中,fut.wait_for(std::chrono::seconds(1))
会阻塞当前线程1秒钟,如果任务在1秒钟内完成,则返回std::future_status::ready
,否则返回std::future_status::timeout
。
如果异步任务中抛出了异常,std::future
的get()
方法会重新抛出该异常。
#include <iostream>
#include <future>
#include <thread>
#include <stdexcept>
int compute() {
throw std::runtime_error("Something went wrong!");
return 42;
}
int main() {
std::future<int> fut = std::async(std::launch::async, compute);
try {
int result = fut.get();
std::cout << "Result: " << result << "\n";
} catch (const std::exception& e) {
std::cout << "Exception: " << e.what() << "\n";
}
return 0;
}
在这个例子中,compute
函数抛出了一个异常,fut.get()
会捕获并重新抛出该异常,主线程中的try-catch
块会捕获并处理该异常。
std::future
对象可以与多个std::shared_future
对象共享同一个共享状态。std::shared_future
允许多个线程等待同一个异步任务的结果。
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int compute() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
void print_result(std::shared_future<int> fut) {
int result = fut.get();
std::cout << "Result: " << result << "\n";
}
int main() {
std::future<int> fut = std::async(std::launch::async, compute);
std::shared_future<int> shared_fut = fut.share();
std::thread t1(print_result, shared_fut);
std::thread t2(print_result, shared_fut);
t1.join();
t2.join();
return 0;
}
在这个例子中,fut.share()
返回一个std::shared_future<int>
对象shared_fut
,该对象可以与多个线程共享同一个异步任务的结果。
std::future
是C++11中用于异步编程的重要工具,它允许我们在一个线程中启动一个异步任务,并在另一个线程中获取该任务的结果。通过std::async
、std::promise
和std::packaged_task
,我们可以灵活地创建和管理std::future
对象。此外,std::future
还提供了丰富的接口来检查任务状态、处理异常以及共享任务结果。
希望本文能够帮助读者更好地理解和使用std::future
,从而编写出更加高效和可靠的异步代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。