21xrx.com
2024-11-10 00:55:37 Sunday
登录
文章检索 我的文章 写文章
如何在C++中等待多个任务完成
2023-06-29 04:29:20 深夜i     --     --
C++ 等待 多个任务 完成 并发编程

在C++中,当我们需要同时执行多个任务时,我们通常会使用多线程来实现这个目标。但是,当我们需要等待所有的任务完成后再进行下一步操作时,我们该如何实现呢?

在C++中,我们可以使用std::thread类来创建一个线程,并通过join()方法等待线程执行完成。但是,如果有多个线程,每个线程都需要调用join()方法,这将非常繁琐且不方便。为此,我们可以使用std::thread数组来存储线程,然后循环调用join()方法来等待所有线程执行完成:


#include <iostream>

#include <thread>

#include <vector>

void task1(int id) {

  std::cout << "Task " << id << " start\n";

  // 执行任务

  std::cout << "Task " << id << " finish\n";

}

int main() {

  std::vector<std::thread> threads;

  // 创建5个任务并放到线程数组中

  for (int i = 0; i < 5; i++) {

    threads.emplace_back(task1, i);

  }

  // 等待所有任务完成

  for (std::thread& t : threads) {

    t.join();

  }

  // 所有任务已完成

  std::cout << "All tasks finish\n";

  return 0;

}

在上面的代码中,我们首先创建了一个std::vector数组来存储线程。然后,我们使用emplace_back()方法将5个线程放到数组中。最后,我们循环遍历线程数组,并调用join()方法等待所有线程执行完成。

需要注意的是,等待所有线程完成的时候,我们使用了std::thread的引用变量t,这是因为join()方法需要传入一个非临时的可移动引用(non-const rvalue reference),因此我们需要将线程引用放到循环中。

在实际开发中,如果你需要等待多个任务完成,并且常常需要执行这样的操作,你可以将等待多个任务完成的功能封装成一个函数,方便调用。比如:


void wait_all(std::vector<std::thread>& threads) {

  for (std::thread& t : threads) {

    t.join();

  }

}

这个函数接受一个线程数组,并等待所有线程完成。这样,我们在需要等待多个任务完成的时候,就可以直接调用wait_all()函数:


int main() {

  std::vector<std::thread> threads;

  // 创建5个任务并放到线程数组中

  for (int i = 0; i < 5; i++) {

    threads.emplace_back(task1, i);

  }

  // 等待所有任务完成

  wait_all(threads);

  // 所有任务已完成

  std::cout << "All tasks finish\n";

  return 0;

}

这样,我们就可以轻松地处理多个任务的同时执行和等待完成的问题了。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复