簡體   English   中英

池中的最大線程數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM