登錄 |創建賬號 |找回密碼
查看: 80|回復: 0

c++11 std::future的简单介绍和简单使用代码

[複製鏈接]

23

主題

6

回帖

130

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
130
發表於 2024-3-25 10:17:40 | 顯示全部樓層 |閱讀模式
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的简单示例:
  1. #include <iostream>
  2. #include <future>
  3. #include <chrono>
  4. #include <thread> // 包含thread头文件来使用this_thread::sleep_for

  5. // 一个简单的函数,比如进行一些计算
  6. int compute(int x) {
  7.     // 假设这个计算需要一些时间
  8.     std::this_thread::sleep_for(std::chrono::seconds(2));  // 使当前线程暂停2秒
  9.     return x * x;
  10. }

  11. int main() {
  12.     // 启动异步任务
  13.     std::future<int> result = std::async(std::launch::async, compute, 10);

  14.     // 在等待结果的同时可以做一些其他的事情
  15.     std::cout << "Waiting for the result..." << std::endl;

  16.     // 等待异步任务完成并获取结果
  17.     int value = result.get();  // 注意:调用get()之后,future不能再次使用

  18.     std::cout << "The result is: " << value << std::endl;

  19.     return 0;
  20. }
複製代碼

这个示例展示了如何启动一个异步任务,并在未来某个时刻获取这个任务的结果。注意,调用std::future::get()方法会阻塞当前线程,直到异步操作完成并且结果可用。一旦调用了get()方法,该future对象就不能再次使用来获取结果。
注意事项
  • std::future::get()只能被调用一次。调用后,future对象将不再持有任何值。
  • 如果异步操作抛出一个异常,该异常会在调用get()时被重新抛出。
  • std::async的行为部分取决于传递给它的启动策略参数(例如,std::launch::async或std::launch::deferred)。如果不指定策略,实现选择的策略可能会导致异步操作立即开始,或者延迟到future的get()或wait()被调用时才开始。


编译命令:
  1. g++ -std=c++11 main.cpp -o main -pthread
複製代碼



回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 創建賬號

本版積分規則

Archiver|手機版|小黑屋|九派社區 ( 苏ICP备07501547号-12 )

GMT+8, 2024-5-21 15:15 , Processed in 0.045452 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回復 返回頂部 返回列表