我想同時暫停多個在 Linux 上運行的 C std 執行緒。作業系統似乎不支持此功能。
執行緒處理需要不均勻且不可預測的時間量(幾秒鐘)的任務。當 CPU 溫度高于閾值時,我想暫停它們。僅在任務之間檢查任務中的暫停是不切實際的。
我只想讓所有作業人員暫停操作幾毫秒。那怎么可能呢?
我目前在做什么
我目前在一個苗條的自定義二進制信號量類中使用條件變數(想想 C 20 信號量)。作業人員在開始下一個任務之前通過獲取并立即釋放信號量來檢查暫停。如果溫度太高,一個單獨的控制執行緒會占用控制信號量幾毫秒。這通常效果很好并且CPU溫度穩定。
我不太關心掛起執行緒的輕微延遲。但是,當一個任務比其他任務花費幾秒鐘的時間時,它的執行緒將繼續單獨運行。這會激活 CPU turbo 模式,這與我想要實作的相反(它的電源效率相對較低,因此對散熱不利)。我無法停用 CPU turbo,因為我不控制硬體。換句話說,這些任務需要很長時間才能完成。所以我想從外面強行暫停它們。
uj5u.com熱心網友回復:
當 CPU 溫度高于閾值時,我想暫停它們。
一般來說,這是本末倒置。
正確設計的硬體應具有足夠的冷卻能力以實作最大負載,并且您的程式不應超過該冷卻能力。
此外,由于您在談論 Turbo,我們可以假設一個 Intel CPU,它會自行熱調節,使您的程式運行速度變慢而無需您做任何事情。
換句話說,任務需要太長時間才能完成
您可以將任務分成更小的部分,并更頻繁地檢查信號量。
一個單獨的控制執行緒占用控制信號量幾毫秒
您的硬體確實不太可能對毫秒延遲做出反應——對于任何熱量來說,時間尺度都太短了。當溫度上升并接近您的極限時,您可能會更好地監控溫度并簡單地減少您正在安排的任務數量。
我現在用
pthread_killand實作了它SIGRT。
請注意,掛起處于未知狀態的執行緒(無論目標任務在收到信號時正在做什么)是導致死鎖的一種方法。任務可能在里面malloc,可能持有任意鎖等等。
如果您的“控制執行緒”也需要該鎖,它將阻塞并且您輸了。您的控制執行緒必須只執行直接系統呼叫,不能呼叫libc等等。
該解決方案無法測驗,也無法正確實施。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/482953.html
