[英]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.