【问题标题】:Max number threads in pool池中的最大线程数
【发布时间】:2017-06-11 13:57:23
【问题描述】:

我是 C++ 多线程编程的新手,我正在尝试在我的代码中使用线程池。我的代码很简单。

#include <iostream>
#include <vector>
#include <thread>

const int SIZE = 100000;

void foo() {
    std::cout << "foo" << std::endl;
}

int main() {
    std::vector<std::thread> myThreads;

    for (int i = 0; i < SIZE; i++) {
        myThreads.push_back(std::thread(foo));
    }

    for (auto& myThread : myThreads) {
        myThread.join();
    }

    return 0;
}

当我在 Windows 10 上从 Visual Studio 15 运行此代码时,没问题。有用。我的问题是当我在 Raspberry Pi 3 上运行它时,我收到一条错误消息:

terminate called after throwing an instance of 'std::system_error'
  what(): Resource temporarily unavailable

现在我假设正在发生的事情是 Pi 的弱 CPU 根本无法同时处理如此大量的线程。当我将 SIZE 更改为 100 或 200 时,代码执行良好。

那么为什么这么多线程会导致程序失败呢?线程没有等待执行还是有什么问题?

【问题讨论】:

  • 您误解了线程池的目标。池是少量线程,通常每个处理器内核只有一个可用,可用于工作。作业被分配到池中,其中一个线程将被分配作业。有许多工作分配方案可以分散工作,这样就不会有一个线程负担过重,而其他线程则闲置。
  • 线程池的全部意义在于允许您使用少量线程,不会比您拥有的内核数量大多少。看看我写的this简单线程池。
  • 我打算用一个简单的线程池示例来回答这个问题,以帮助您理解 thread pool 和线程列表之间的区别,但 @DavidSchwartz already 这样做了。此外,您试图告诉内核在一个紧密的循环中创建和管理 100,000 个线程;这可能在您的 Window 机器(可能具有 Intel CPU)上运行良好,但由于架构和线程管理的差异,在您基于 ARM 的 Pi 上可能会阻塞。
  • 对我来说闻起来像是 OutOfMemory 异常。

标签: c++ multithreading


【解决方案1】:

一次创建比系统可以提供的内核数量更多的线程是没有意义的,它们只会争夺 CPU 时间并减慢您的应用程序的速度。

如前所述,您可以使用 std::thread::hardware_concurrency() 获取它,但不确定 Raspberry,在某些平台上它只返回 0。

如果您有很多作业(比 CPU 内核多得多),您应该使用一些线程池实现,将您的作业放入队列并一次执行不超过 N 个(通常是 std::thread::hardware_concurrency()

你可以在 GitHub 上找到大量简单的线程池实现,for example

【讨论】:

  • 创建多于系统可提供的内核数量的线程有很多原因。最明显的一个是即使您的一个线程在 I/O 上没有被阻塞,比如由于页面错误,您也可以让所有内核保持忙碌。
【解决方案2】:

通常人们将线程数限制为std::thread::hardware_concurrency() 之类的东西,以将其限制为硬件上的内核数。

当然,您可以创建更多线程。但并非所有线程都能够运行,并且每个线程都有自己分配的堆栈帧。 -- 因此,在某些时候,您的硬件(Raspberry Pi)上的虚拟内存会用完。

(也可以通过调整堆栈大小来适应更多...请小心。)

【讨论】:

    【解决方案3】:

    线程占用空间。它们需要用于控制结构和存储上下文的内存。此外,它们在某些环境中需要系统句柄。系统句柄是有限的。您可能正在对 Raspberry Pi 上的操作系统能力征税。

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2010-12-23
      • 2014-10-13
      • 2012-06-19
      相关资源
      最近更新 更多