簡體   English   中英

在 C++ Linux 中限制或限制正在運行的線程

[英]Limit or throttle running threads in C++ Linux

我正在使用 Pagmo,一個 C+ API 來解決我的優化問題。 當啟動新的優化時,Pagmo 通過調用 island.evolve() 啟動一個新線程。 我的觀點是,我在這里對 Pagmo“幕后”啟動的線程類型沒有細粒度的控制。 我可以查詢 Pagmo 線程的狀態——關於它們是否已完成運行。 我有一台有 28 個物理內核的機器,我認為我正在運行的線程的最佳數量應該是 28 個。現在,我的代碼只是將所有線程轉儲到機器上,這遠遠超過了核心數量 - 因此,效率可能非常低。 我正在考慮使用 std::counting_semaphore (C++ 20) 並將計數器設置為 28。每次我在 Pagmo 中啟動一個線程時,我都會減少信號量計數器。 當它達到 0 時,其余線程將阻塞並在隊列中等待,直到計數器遞增。 我想我可以運行一個循環來查詢 Pagmo 線程的狀態,並在每次線程空閑時增加 std::counting_semaphore 的計數器(意味着它的任務已完成)。 當然,Pagmo 線程最終是加入的。 每次計數器超過 0 時,都允許啟動一個新線程 - 我相信。 我的問題是:

  1. 關於如何使用現代 C++ 限制/限制正在運行的線程數的最佳實踐是什么?
  2. 有沒有我沒有想到的更好的方法?
  3. 有沒有辦法實時查詢Linux,運行線程數? 提前致謝! 菲爾

我曾嘗試過一個簡單的循環來啟動和限制廣告的創建,但事實證明效果不佳,線程啟動得太快。

首先,您的帖子可以進行一些編輯,甚至可以提供一個代碼片段來幫助我們更好地理解問題。 現在我只是根據對你在那里做什么的瘋狂猜測來瀏覽文檔。

我已經快速檢查了Pagmo是關於什么的,我首先建議在從庫外部限制任何為並行計算而設計的庫時要小心。

我會盡量回答你的問題:

  1. 我認為這不是限制外部庫創建的線程的最佳方法
  2. 是的,首先我檢查了Pagmo API 文檔,如果我理解正確的話,你正在使用一個island類——根據他們在文檔中的聲明,繼承island並由默認 ctor 構造的默認類是thread_island (至少在非 POSIX 系統上——這可能不是你的情況)。 然而, thread_island可以通過thread_island(bool use_pool) ctor構造,這表明您可以為這些island類指定一個它們可以使用的公共線程池。 如果它是針對非 POSIX 系統完成的,那么它很可能也適用於 POSIX 系統。 所以如果你想限制線程的數量,我會通過線程池來做到這一點。
  3. 您可以通過/proc/sys/kernel/threads-max限制在 linux 上運行的最大線程數,您還可以通過niceness指示 Linux 系統處理一些不太重要的進程

希望能幫助到你!

編輯:作為腳注,我還要提到文檔實際上鼓勵使用thread_island即使在 POSIX 系統上也是如此。 在此處查看此鏈接

EDIT2:如果由於無法保證thread_safety時提到的問題而必須使用fork_island 那么另一種選擇是通過setrlimit限制可用資源,請在此處查看此鏈接- 您有興趣設置RLIMIT_NPROC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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