2017-01-26 73 views
0

我是新来的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运行此代码时,没有问题。有用。我的问题是,当我在我的树莓派3运行它,我得到一个错误,指出:

terminate called after throwing an instance of 'std::system_error' 
    what(): Resource temporarily unavailable 

现在我认为发生的事情是,郫县的薄弱CPU根本无法在处理线程的这么大的量一旦。当我将SIZE更改为100或200时,代码执行得很好。

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

+0

可能重复执行不大于N(通常是std::thread::hardware_concurrency()) [多线程在C++中抛出线程构造tor失败:资源暂时不可用](http://stackoverflow.com/questions/26691340/multi-threading-in-c-throws-thread-constructor-failed-resource-temporarily-un) – Swift

+2

你错误地解释了线程池。池是少量线程,通常只有每个可用的处理器内核可用于执行工作。作业分配给池,其中一个线程将分配作业。有一些工作分配计划来分散工作,以便没有一个线程被过度纳税,而另一些线​​程闲置。 – user4581301

+2

线程池的重点在于允许您使用少量的线程,而不是比您拥有的核心数量大得多。看看[this](http://stackoverflow.com/a/29742586/721269)我写的简单线程池。 –

回答

0

线程占用空间。他们需要内存控制结构和存储上下文。另外,它们在某些环境中需要系统句柄。系统手柄是有限的。您可能会在Raspberry Pi上对操作系统的能力征税。

0

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

当然,您可以创建更多线程。但是并不是所有的都可以运行,并且每个线程都有自己分配的堆栈帧。 - 所以在某些时候,你的硬件上会有一个虚拟内存,一个Raspberry Pi。

也可能适合更多在,通过调整堆栈大小......只是要小心。

0

毫无意义的多了一些核心的同时创建多个线程您的系统可以提供,他们只会争夺CPU时间并减慢应用程序。

如前所述,您可以使用std::thread::hardware_concurrency()得到它,但不知道覆盆子,在一些平台上,它只是返回0

如果你有很多的就业机会(比CPU内核更多),你应该使用一些线程池的实现,即把你的作业到队列中,在时间

你可以找到大量的GitHub上简单的线程池实现的,for example

+0

有很多原因可以创建比您的系统可提供的核心数量更多的线程。最明显的一点是,即使其中一个线程在I/O上未被阻塞(例如由于页面错误),也可以让您保持所有内核忙碌。 –