2017-01-26 72 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上未被阻塞(例如由於頁面錯誤),也可以讓您保持所有內核忙碌。 –