[英]Max number threads in pool
我是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時,代碼執行正常。
那么,為什么這么多線程導致程序失敗呢? 線程是否不等待執行?是什么問題?
線程占用空間。 它們需要用於控制結構並存儲上下文的內存。 另外,它們在某些環境中需要系統處理。 系統句柄是有限的。 您可能正在對Raspberry Pi上的OS功能進行評估。
通常,人們將線程數限制為std::thread::hardware_concurrency()
以將其限制為硬件上具有的內核數。
當然,您可以創建更多線程。 但是並不是所有的線程都能運行,並且每個線程都有自己分配的堆棧幀。 -這樣一來,您的Raspberry Pi硬件上的虛擬內存就會用完。
( 也可以通過調整堆棧大小來適應更多...請注意。 )
一次創建多個線程沒有多於系統可以提供的多個內核的意義,它們只會競爭CPU時間並降低應用程序速度。
如前所述,您可以使用std::thread::hardware_concurrency()
來獲取它,但不確定Raspberry,在某些平台上它僅返回0。
如果您有很多工作(比CPU內核多得多),則應使用一些線程池實現,這會將您的工作放入隊列並執行不超過N(通常為std::thread::hardware_concurrency()
)一次
你可以找到很多簡單的線程池的實現在GitHub上, 例如
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.