当前位置: 首页 > wzjs >正文

在哪里申请网站女教师遭网课入侵直播录屏曝

在哪里申请网站,女教师遭网课入侵直播录屏曝,网建部,低调与华丽wordpress下载C异步编程四剑客:future、async、promise和packaged_task详解 1. 引言 1.1 异步编程的重要性 在现代C编程中,异步操作是提高程序性能和响应能力的关键技术。它允许程序在等待耗时操作(如I/O、网络请求或复杂计算)完成时继续执行…

C++异步编程四剑客:future、async、promise和packaged_task详解

1. 引言

1.1 异步编程的重要性

在现代C++编程中,异步操作是提高程序性能和响应能力的关键技术。它允许程序在等待耗时操作(如I/O、网络请求或复杂计算)完成时继续执行其他任务,从而充分利用系统资源。

1.2 C++中的异步工具

C++11引入了强大的异步编程支持,主要包括四个核心组件:

  • std::future/std::shared_future:异步结果获取机制
  • std::async:简单的异步任务启动器
  • std::promise:异步结果提供者
  • std::packaged_task:可调用对象的包装器

2. std::future:异步结果的桥梁

2.1 基本概念

std::future是一个模板类,它提供了一种访问异步操作结果的机制。一个future对象通常与某个异步操作相关联,并可以在未来某个时刻获取该操作的结果。

2.2 主要功能

  • get():获取异步操作的结果(如果结果未就绪,会阻塞当前线程)
  • wait():等待异步操作完成
  • wait_for()/wait_until():带超时的等待

2.3 使用示例

#include <iostream>
#include <future>
#include <thread>int compute() {std::this_thread::sleep_for(std::chrono::seconds(2));return 42;
}int main() {std::future<int> result = std::async(std::launch::async, compute);std::cout << "Waiting for result..." << std::endl;std::cout << "Result: " << result.get() << std::endl;return 0;
}

3. std::async:简单的异步任务启动器

3.1 基本用法

std::async是启动异步任务的最简单方式,它返回一个std::future对象,通过该对象可以获取异步任务的结果。

3.2 启动策略

  • std::launch::async:强制在新线程中执行
  • std::launch::deferred:延迟执行,直到调用future.get()future.wait()
  • 默认策略:由实现决定

3.3 注意事项

  • 返回值std::future析构时会隐式等待
  • 不适合需要精细控制线程的场景

3.4 示例代码

auto future1 = std::async(std::launch::async, []{// 耗时计算return calculateSomething();
});auto future2 = std::async(std::launch::deferred, []{// 这个任务不会立即执行return calculateSomethingElse();
});// 只有调用get()时才会执行future2的任务
auto result = future1.get() + future2.get();

4. std::promise:手动设置异步结果

4.1 核心概念

std::promise允许显式地设置一个值或异常,这个值可以通过关联的std::future对象获取。

4.2 典型使用场景

  • 需要手动控制结果设置的时机
  • 跨线程回调
  • 复杂异步流程控制

4.3 基本用法

#include <iostream>
#include <future>
#include <thread>void compute(std::promise<int> prom) {try {int result = 42; // 模拟计算prom.set_value(result);} catch(...) {prom.set_exception(std::current_exception());}
}int main() {std::promise<int> prom;std::future<int> fut = prom.get_future();std::thread t(compute, std::move(prom));t.detach();std::cout << "Result: " << fut.get() << std::endl;return 0;
}

5. std::packaged_task:可调用对象的包装器

5.1 基本概念

std::packaged_task包装一个可调用对象(函数、lambda表达式、函数对象等),并允许异步获取该调用的结果。

5.2 主要特点

  • 将任务与结果获取分离
  • 可以像普通函数对象一样被调用
  • 适合需要将任务传递给线程池的场景

5.3 使用示例

#include <iostream>
#include <future>
#include <thread>
#include <deque>std::deque<std::packaged_task<int()>> task_queue;void worker_thread() {while (!task_queue.empty()) {auto task = std::move(task_queue.front());task_queue.pop_front();task(); // 执行任务}
}int main() {std::packaged_task<int()> task([]{return 42;});std::future<int> result = task.get_future();task_queue.push_back(std::move(task));std::thread t(worker_thread);t.join();std::cout << "Result: " << result.get() << std::endl;return 0;
}

6. 四者的比较与选择指南

6.1 功能对比

工具适用场景线程管理灵活性
std::async简单异步任务自动
std::promise需要手动设置结果的复杂场景手动
std::packaged_task需要传递任务对象的场景手动

6.2 选择建议

  1. 优先考虑std::async:适用于简单的异步任务
  2. 需要精细控制时使用std::promise
  3. 需要将任务对象传递给线程池时使用std::packaged_task

7. 高级主题与最佳实践

7.1 异常处理

  • 使用promise.set_exception()传递异常
  • future.get()时捕获异常

7.2 超时控制

auto status = future.wait_for(std::chrono::seconds(1));
if (status == std::future_status::ready) {// 任务已完成
} else {// 超时处理
}

7.3 共享结果

使用std::shared_future实现多线程共享异步结果:

std::promise<int> prom;
std::shared_future<int> shared_fut = prom.get_future().share();// 多个线程可以同时访问shared_fut

8. 总结

C++的异步编程工具提供了不同层次的抽象,从简单的std::async到更灵活的std::promisestd::packaged_task,开发者可以根据具体需求选择合适的工具。理解这些工具的特性和适用场景,能够帮助我们编写出更高效、更健壮的并发程序。

http://www.dtcms.com/wzjs/336790.html

相关文章:

  • 创建一个网站 优帮云河南今日头条新闻
  • 哈尔滨网站设计人b2b电子商务平台
  • 上海工程建设信息网站百度云电脑版网站入口
  • php自己写框架做网站app推广引流渠道
  • 高密住房和城乡建设局网站全球十大网站排名
  • 做违法网站会怎么样新浪舆情通官网
  • 哪个网站可以找题目给小孩做安徽seo
  • wordpress怎么加音乐网站优化入门免费教程
  • 网站建设公司有百度查重入口
  • 电子商务网站建设精英郑州做网络营销渠道
  • 佛山企业网站设计制作微商软文
  • 合肥市建设工程造价管理站网站今日热点新闻事件摘抄
  • 万州电商网站建设it教育培训机构排名
  • 三类人员 网站开发北京seo公司排名
  • 网站建设完毕后怎么加后台合肥seo
  • 建网站热线电话账号权重查询入口站长工具
  • 汽车租赁网站设计识别关键词软件
  • 房地产销售赚钱吗手机端网站优化
  • 济南网站建设外包公司哪家好杭州百度推广优化排名
  • 网站作业代做搜狗推广登录平台
  • 王占山将军是什么军衔百度seo怎么做网站内容优化
  • wordpress全能播放器代码双滦区seo整站排名
  • iis网站怎么做全站伪静态最近的时事新闻
  • 怎样做免费网站的推广外链信息
  • 小程序如何做外部连接网站产品软文范例大全
  • 网站链接怎么做标记代运营一个月多少钱
  • flarum整合wordpress网站怎么优化排名靠前
  • 网站投放广告赚钱吗高级搜索入口
  • WordPress 分类 调用灰色行业seo
  • 网站流量怎么做乡1万济南网络推广公司电话