21xrx.com
2025-06-21 05:31:44 Saturday
文章检索 我的文章 写文章
探究:C++线程池future技术
2023-06-30 19:32:13 深夜i     57     0
C++ 线程池 future技术 并发编程 任务调度

在C++编程中,线程池和future技术经常被应用于需要并发执行的任务中。线程池是一组由操作系统管理的线程,这些线程在一个共享任务池中处理任务。而future技术则允许程序员在一条主线程中发出任务并等待结果,而不必关心底层线程的调度和同步。

C++标准库提供了一个线程池和future技术的实现,即std::async和std::future。这两个类结合使用可以简化代码并提高程序的并发性能。

std::async函数可以异步执行一个函数,返回一个std::future对象。std::future对象可以用来获取函数执行后的返回值,或者判断函数是否已经完成执行。例如:

#include <iostream>
#include <future>
int main() {
  auto future = std::async([]()
    return 42;
  );
  std::cout << "Waiting...\n";
  std::cout << "Result: " << future.get() << '\n';
  return 0;
}

上述代码中,lambda表达式作为参数传递给了std::async函数,并返回42。std::async函数返回了一个std::future对象,然后在主线程中等待(使用future.get()函数)直到子线程返回结果。

对于需要执行多个类似的任务的情况,可以使用 std::async 和 std::vector 来创建一个线程池。

#include <iostream>
#include <vector>
#include <future>
int main() {
  std::vector<std::future<int>> results;
  for (int i = 0; i < 10; ++i) {
    results.emplace_back(std::async([](int id)
      return id;
    , i));
  }
  for (auto& result : results) {
    std::cout << result.get() << ' ';
  }
  std::cout << '\n';
  return 0;
}

上述代码中,创建了一个 std::vector 对象 std::results 来保存子线程返回的结果。在 for 循环中,使用 std::async 和 lambda 表达式来创建子线程并执行任务。注意到 lambda 表达式中,函数返回的是传递给它的参数 id。最后,在主线程中遍历 std::results 并输出结果。

虽然 std::async 和 std::future 可以帮助简化并发编程,但是需要注意的是:

1. std::async 使用默认的线程池,线程数目依赖于硬件和操作系统,无法准确控制。

2. std::async 并不是一定比手动创建线程更高效,具体取决于任务的复杂度和数量。

3. 对于较大规模的并发任务,最好使用更为强大的第三方线程库,例如 Boost 库的 thread_pool。

  
  

评论区