21xrx.com
2024-12-23 00:03:55 Monday
登录
文章检索 我的文章 写文章
探究:C++线程池future技术
2023-06-30 19:32:13 深夜i     --     --
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。

  
  

评论区

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