【发布时间】: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