簡體   English   中英

如何在 C/C++ 中降低線程優先級

[英]how to lower thread priority in C/C++

我想降低線程的優先級。

我的線程的默認策略是SCHED_OTHER ,我的系統(Ubuntu)下的優先級范圍是 [0,0] (我通過sched_get_priority_min(SCHED_OTHER)sched_get_priority_max(SCHED_OTHER)獲得范圍),這意味着所有具有SCHED_OTHER線程都將具有相同的優先級。

有什么方法可以降低SCHED_OTHER的優先級嗎? 我已經搜索了一段時間,我找到了nice價值系統,但不確定這是否是正確的方法,因為手冊頁說好的價值是針對進程而不是線程,我很困惑......

誰能給出正確的解決方案來做到這一點,也許還有一個簡短的代碼片段? 謝謝!

添加:

為什么我想降低線程的優先級:

我有一個工作線程,它定期進行一些密集計算(例如,每分鍾幾秒鍾,因此會導致一些 CPU 使用率峰值),並且我的整個系統將定期體驗性能下降。 但是這個工作線程的優先級很低,只要能在下一分鍾之前完成計算就可以了。 所以我想在這個時間窗口平滑地分攤這個任務的計算。

事實上,Linux 上調度優先級的情況對於進程與線程的適用情況非常混亂。 在規范級別, nicesetpriority適用於進程,但 Linux 實際上並不支持這樣做,因此它將參數解釋為內核級線程 ID(與pthread_t ,並且沒有標准的用戶空間 API 來請求線程的內核級 tid!)。

您也許可以使用SCHED_IDLESCHED_BATCH實現您想要的SCHED_BATCH ,但它們也不能正常工作。

假設您運行的是相當新版本的 Linux 內核,您可以嘗試將您的線程設置為 SCHED_IDLE, 如此鏈接所示,即:

void set_idle_priority() {                                              
   struct sched_param param;
   param.sched_priority = 0;
   if (pthread_setschedparam(pthread_self(), SCHED_IDLE, &param) != 0)
      perror("pthread_setschedparam");
} 

在這種模式下,你的線程只會在系統中沒有其他東西想要運行時運行。

...也就是說,我不相信這樣做會真正解決您的問題,因為從您的描述來看,您一開始就不應該遇到這個問題。 特別是,以正常/默認優先級運行的 CPU 占用線程的存在不應顯着降低您的系統速度,因為調度程序應自動檢測其占用 CPU 的性質並隱式降低其優先級,而無需您采取任何特殊步驟。 這讓我認為您的問題可能不是線程的 CPU 使用率,而是其他問題,例如您的線程可能耗盡了系統的所有可用 RAM 容量,導致系統必須將內存分頁到磁盤。 那肯定會導致系統顯着減慢。 另一種可能性是您的線程是否正在執行大量磁盤 I/O(盡管這似乎不太可能,因為在這種情況下它可能不會固定 CPU 內核)。

您可以嘗試用一個簡單的 CPU 燃燒循環臨時替換線程的計算,例如:

void my_thread_entry_func()
{
   while(1) {/* empty */}
}

...並運行它只是為了看看它是否也會引起減速。 如果不是,那么導致速度變慢的不是 CPU 使用率本身,而是您的線程正在執行的其他操作,您將需要進行進一步測試以准確縮小線程執行路徑的哪一部分是罪魁禍首。

暫無
暫無

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

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