行业知识
【C++11】std::async函数介绍及问题梳理
目录
1. std::async 简介
2. 问题梳理
2.1 std::async(异步执行) 到 future get 直接调用会如何抛异常
2.2 std::async 如果通过劫持让 new 内存不够,有没有可能抛异常
2.3 std::async 如果系统线程不够有没有可能异常
3. gdb调试async详情
3.1 模拟调用 new 失败场景
3.2 模拟调用 linux api 失败场景
1. std::async 简介
std::async 是 C++11 标准库中用于异步执行的函数,会返回一个 std::future 对象,以获取函数的执行结果。可用其在新线程中执行函数,也可以在当前线程中执行。std::async 的函数声明形式通常如下:
template std::future std::async(std::launch policy, F&& f, Args&&... args);
说明:
-
template :函数模板声明。F 是要执行的函数类型,Args... 是函数参数类型的模板参数包【这意味着函数可以接受任意数量的参数】
-
std::future:这是 std::async 函数的返回类型。它是一个 std::future 对象,包装了函数 F 的返回类型。std::future 允许在未来的某个时间点获取函数的执行结果。
-
std::async(std::launch policy, F&& f, Args&&... args):这是函数 std::async 的声明。它接受三个参数:
- policy: std::launch 类型的参数,表示函数执行的策略,有如下2种:
std::launch::async(在新线程中异步执行)
std::launch::deferred(延迟执行,在调用 std::future::get() 或 std::future::wait() 时执行)。 - f:通用引用(universal reference),表示要执行的函数对象。通用引用允许 f 接受任意类型的参数。
- args:这是函数 f 的参数列表。可以是零个或多个参数。
- policy: std::launch 类型的参数,表示函数执行的策略,有如下2种:
-
这个函数的作用是根据给定的执行策略异步执行函数 f,并返回一个 std::future 对象,可用来等待函数的执行完成并获取函数的结果。
注意:
std::async 的行为受到执行策略参数【 std::launch 类型的参数】的影响,可能在调用时立即执行,也可能延迟到 std::future::get() 或 std::future::wait() 被调用时才执行。
2. 问题梳理
2.1 std::async(异步执行) 到 future get 直接调用会如何抛异常
std::async 到 std::future::get 直接调用会抛出异常,主要有两种情况:
- 函数对象抛出异常。
- 如果使用 std::launch::async 策略,并在调用 std::future::get 之前的函数执行抛出了异常,这种情况下会导致 std::future::get 抛出 std::future_error 异常。
【示例1】函数对象抛出异常
#include #include // 抛出异常void task1() { throw std::runtime_error("An error occurred in task1()");}int main() { try { // 使用 std::async 启动一个异步任务 auto future1 = std::async(std::launch::async, task1); // 等待异步任务的完成并获取结果 future1.get(); // 这里会抛出异常 } catch (const std::exception& e) { std::cerr
上一篇:直播视频服务器怎么连接?
下一篇:揭秘易语言数组清空技巧!