std::async介绍并使用
std::async
是C++11引入的一个用于异步执行函数或函数对象的工具。它可以用于并行地执行函数,并在需要时获取函数的返回值。下面是一个简单的示例,演示了如何使用std::async
:
#include <iostream>
#include <future>
// 一个简单的函数,将两个整数相加并返回结果
int Add(int a, int b) {
return a + b;
}
int main() {
// 使用std::async异步执行函数
std::future<int> future_result = std::async(Add, 5, 3);
// 在需要时获取函数的返回值
int result = future_result.get();
std::cout << "Result: " << result << std::endl;
return 0;
}
在上面的示例中,我们首先定义了一个简单的函数Add
,它将两个整数相加并返回结果。然后,我们使用std::async
来异步执行Add
函数,传递两个整数参数(5和3)。std::async
返回一个std::future
对象,表示异步任务的未来结果。最后,我们使用get
函数从std::future
中获取异步任务的结果。
需要注意以下几点:
-
std::async
会创建一个新的线程或使用线程池来执行函数,具体取决于实现。 -
使用
get
函数获取结果时,如果异步任务尚未完成,调用将阻塞,直到结果可用。 -
可以通过在
std::async
的第一个参数中传递std::launch::async
或std::launch::deferred
来控制任务的执行方式。默认情况下,它使用实现定义的默认策略。
请注意,std::async
的用法可能因C++标准库的实现而异,某些实现可能不支持线程池,因此可能在不同平台上表现不同。还要注意,std::async
的性能开销较高,对于某些简单的任务,使用std::thread
等其他方法可能更合适。
std::thread和std::async区别
std::thread
和std::async
都是C++11引入的多线程编程工具,用于创建并发执行的线程。它们之间的主要区别在于用法和返回结果的处理方式。
-
std::thread:
-
std::thread
用于手动创建线程。您需要显式创建线程对象并将函数或函数对象传递给它,然后调用std::thread
的join
或detach
函数来管理线程的生命周期。 -
std::thread
不提供一种直接方式来获取线程函数的返回值,因此通常需要使用共享数据结构(如std::mutex
和std::condition_variable
)来在线程之间传递结果。 -
下面是一个简单的示例,演示了
std::thread
的用法:
#include <iostream> #include <thread> void ThreadFunction(int value) { std::cout << "Thread value: " << value << std::endl; } int main() { std::thread t(ThreadFunction, 42); t.join(); // 等待线程执行完毕 return 0; }
-
-
std::async:
-
std::async
用于创建异步任务,它返回一个std::future
对象,该对象表示异步任务的未来结果。您可以使用std::future
的get
函数来获取异步任务的结果,这将会阻塞,直到结果可用。 -
std::async
可以选择性地指定任务的执行策略(std::launch::async
或std::launch::deferred
)。默认情况下,它使用实现定义的默认策略。 -
以下是一个简单的示例,演示了
std::async
的用法:
#include <iostream> #include <future> int Add(int a, int b) { return a + b; } int main() { std::future<int> future_result = std::async(Add, 5, 3); int result = future_result.get(); // 获取异步任务的结果 std::cout << "Result: " << result << std::endl; return 0; }
-
总结:
-
std::thread
适用于手动管理线程的生命周期,适用于需要显式控制线程的情况。 -
std::async
适用于创建异步任务,它提供了更方便的方法来获取线程函数的返回值,适用于需要获取任务结果的情况。
选择使用哪个取决于您的需求,如果您需要更多的线程控制和管理,可以使用std::thread
,如果您更关心获取任务结果,可以使用std::async
。