std::async 是 C++11 标准库中引入的一个函数模板,用于启动一个异步任务,并返回一个 std::future 对象,用于获取异步任务的结果。 std::async 提供了一种简单的方式来并行化代码执行,而不需要显式地管理线程的生命周期。

# 1、作用

  • 启动异步任务std::async 启动一个新的任务,这个任务可以在新线程中并行执行。
  • 管理任务结果std::async 返回一个 std::future 对象,允许调用者在异步任务完成后获取结果。
  • 简化并发编程:与直接使用 std::thread 相比, std::async 简化了并发编程,自动管理线程的创建和销毁。

# 2、参数

  1. 启动策略std::launch::asyncstd::launch::deferred
  2. 可调用对象:函数、lambda 表达式、函数对象、成员函数等。
  3. 可调用对象的参数:可变数量的参数,用于传递给可调用对象。

# 3、使用

std::async 可以接受多个参数,包括启动策略、可调用对象(如函数、lambda 表达式、函数对象等)和可调用对象的参数。

# 3.1 基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <future>

int compute() {
return 42;
}

int main() {
std::future<int> result = std::async(compute);

// 阻塞等待结果
std::cout << "Result: " << result.get() << std::endl;

return 0;
}

# 3.2 启动策略

std::async 提供了两种启动策略:

  • std::launch::async :强制在新线程中异步执行任务。
  • std::launch::deferred :延迟执行任务,只有在调用 std::future::get()std::future::wait() 时才执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <future>

int compute() {
return 42;
}

int main() {
// 异步启动
std::future<int> async_result = std::async(std::launch::async, compute);
std::cout << "Async Result: " << async_result.get() << std::endl;

// 延迟启动
std::future<int> deferred_result = std::async(std::launch::deferred, compute);
std::cout << "Deferred Result: " << deferred_result.get() << std::endl;

return 0;
}

# 3.3 带参数的任务

std::async 可以启动带参数的任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <future>

int add(int a, int b) {
return a + b;
}

int main() {
std::future<int> result = std::async(add, 2, 3);

// 阻塞等待结果
std::cout << "Result: " << result.get() << std::endl;

return 0;
}

# 3.4 使用 lambda 表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <future>

int main() {
auto lambda = [](int a, int b) {
return a + b;
};

std::future<int> result = std::async(lambda, 2, 3);

// 阻塞等待结果
std::cout << "Result: " << result.get() << std::endl;

return 0;
}

# 3.5 使用成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <future>

class Calculator {
public:
int multiply(int a, int b) {
return a * b;
}
};

int main() {
Calculator calc;

std::future<int> result = std::async(&Calculator::multiply, &calc, 2, 3);

// 阻塞等待结果
std::cout << "Result: " << result.get() << std::endl;

return 0;
}

同样地,在传递成员函数时,需要额外传递对象。

# 4、 std::asyncstd::thread 的比较

  • 管理线程std::async 自动管理线程的生命周期,而 std::thread 需要手动管理。
  • 返回结果std::async 返回一个 std::future 对象,用于获取异步结果,而 std::thread 不提供此功能。
  • 启动策略std::async 可以选择延迟启动策略,而 std::thread 总是在创建时启动。

总之, std::async 是一个强大且灵活的工具,用于简化并发编程和任务管理。
通过使用 std::async ,程序员可以更容易地实现异步操作,提高程序的性能和响应速度。

更新于

请我喝杯咖啡吧~

Rick 微信支付

微信支付

Rick 支付宝

支付宝