我是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时,代码执行正常。
那么为什么这么多线程导致程序失败呢?线程不等待执行或问题是什么?
答案 0 :(得分:0)
线程占用空间。它们需要内存用于控制结构和存储上下文。此外,它们在某些环境中需要系统句柄。系统句柄有限。您可能会对Raspberry Pi上的操作系统的能力造成负担。
答案 1 :(得分:0)
通常人们会将线程数限制为std::thread::hardware_concurrency()
,以将其限制为硬件上的核心数。
当然,您可以创建更多线程。但并非所有这些都能够运行,并且每个线程都有自己分配的堆栈帧。 - 所以在某些时候,你的硬件上的虚拟内存耗尽了Raspberry Pi。
(也可以通过调整堆栈大小来适应更多...请小心。)
答案 2 :(得分:0)
与系统可以提供的多个内核相比,创建更多线程毫无意义,它们只会争夺CPU时间并降低应用程序的速度。
如前所述,您可以使用std::thread::hardware_concurrency()
获取它,但不确定Raspberry,在某些平台上它只返回0。
如果您有很多工作(远远超过CPU核心),您应该使用一些线程池实现,将您的作业放入队列并执行不超过N(通常为std::thread::hardware_concurrency()
)一段时间
您可以在GitHub上找到大量简单的线程池实现,for example