时间:2017-01-26 05:53:47

标签: c++ multithreading

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

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

3 个答案:

答案 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