前置:async的启动策略
(1)std::launch::async
这个策略要求传给 std::async 的函数 f 必须在另一个线程上异步执行。函数 f 的执行与当前线程是并发的,即不会阻塞调用线程。
(2)std::launch::deferred:
使用此策略时,函数 f 不会立即执行。只有当返回的 std::future 对象上调用了 get() 或 wait() 方法时,函数 f 才会被调用并同步执行。同步执行意味着调用 get() 或 wait() 的线程会被阻塞,直到 f 完成执行。
如果没有调用 get() 或 wait(),那么 f 将永远不会被执行。此外,std::async 允许你不显式地指定启动策略,在这种情况下,实现可以自由选择 std::launch::async 或 std::launch::deferred 来执行任务。某些平台可能会优先考虑性能,选择最适合的策略,这可能取决于系统的当前负载、可用资源等。
(3)使用 std::launch::async 策略
#include<iostream>
#include<future>
#include<chrono>
void print_id(int id) {
std::cout << "Thread ID: " << id << "\n";
}
int main() {
// 使用 launch::async 立即在另一个线程上异步执行任务
auto fut = std::async(std::launch::async, print_id, 42);
// 模拟主程序继续做其他事情
std::this_thread::sleep_for(std::chrono::seconds(1));
// 获取结果(这里只是等待异步操作完成)
fut.get();
return 0;
}
使用 std::launch::deferred 策略