繁体   English   中英

池中的最大线程数

[英]Max number threads in pool

我是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时,代码执行正常。

那么,为什么这么多线程导致程序失败呢? 线程是否不等待执行?是什么问题?

线程占用空间。 它们需要用于控制结构并存储上下文的内存。 另外,它们在某些环境中需要系统处理。 系统句柄是有限的。 您可能正在对Raspberry Pi上的OS功能进行评估。

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

当然,您可以创建更多线程。 但是并不是所有的线程都能运行,并且每个线程都有自己分配的堆栈帧。 -这样一来,您的Raspberry Pi硬件上的虚拟内存就会用完。

也可以通过调整堆栈大小来适应更多...请注意。

一次创建多个线程没有多于系统可以提供的多个内核的意义,它们只会竞争CPU时间并降低应用程序速度。

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

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

你可以找到很多简单的线程池的实现在GitHub上, 例如

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM