c++ 高并发模板类std::async()
发布日期:2021-05-14 06:38:05 浏览次数:17 分类:精选文章

本文共 1191 字,大约阅读时间需要 3 分钟。

C++11 异步编程入门

在 C++11 中,std::async 函数成为异步编程的重要工具。它允许我们在后台线程执行任务,同时返回一个 std::future 对象,这样就能在适当的时候获取执行结果。

异步执行的基础

std::async 函数的默认行为是使用 std::launch::deferred 策略。这意味着新启动的线程会立即执行任务,但当前线程不会等待结果。这样可以避免阻塞主线程,适用于需要长时间执行的任务。

示例代码

#include 
#include
#include
using namespace std;
void task() {
for (int i = 0; i < 10; i++) {
cout << "k" << endl;
}
}
int main() {
// 使用默认策略(deferred),执行任务并阻塞获取结果
auto ret = async(task);
for (int i = 0; i < 10; i++) {
cout << "M";
}
ret.get(); // 阻塞直到任务完成
cout << "probe flag 1" << endl;
sleep(10);
}

通过策略控制线程行为

std::launch 枚举类型提供了多种策略来控制线程的执行方式:

  • std::launch::async:直接启动一个新的线程执行任务,当前线程会等待任务完成。
  • std::launch::deferred:让当前执行完当前线程的任务后,启动新的线程执行剩余部分。默认策略。

通过不同的策略,可以灵活控制线程的创建和执行顺序:

示例代码

{
// 异步执行,启动新的线程并等待结果
auto ret = async(std::launch::async, task);
}
{
// 延迟执行,任务不会阻塞当前线程
auto ret = async(std::launch::deferred, task);
// ret.get() 会等待任务完成
}

注意事项

  • 默认策略std::async 的默认策略是 std::launch::deferred,不要以为它不会执行任务。
  • 资源管理:确保在 future.get() 括号作用域内清理资源,否则可能导致内存泄漏。
  • 阻塞与非阻塞:使用 std::launch::async 会阻塞当前线程,使用 std::launch::deferred 则不会。
  • 通过合理选择 std::launch 策略,我们可以在不同的场景下充分利用异步编程的优势。

    上一篇:嵌入式软件工程师职业路线
    下一篇:bitcoin 数据完整性编码

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月22日 06时13分11秒