我試圖將一個執行緒中的sleep()函式改為pthread_cond_timedwait(),這樣如果需要的話,暫停可以從另一個執行緒停止。我的問題是關于效率的。因為根據我的理解,當使用sleep()時,執行緒是被動等待的,所以不會發生額外的cpu占用。調度器對一個被鎖住的執行緒會做什么?是和sleep()一樣,還是在這種情況下主動等待?因為我可能會使用大量的執行緒,這些執行緒會被暫停很長一段時間(幾分鐘、幾小時或者幾天),我擔心我會使用不必要的cpu時間。
uj5u.com熱心網友回復:
這里是提煉出幾乎所有多執行緒作業系統行為的最好方法,而不考慮一概而論:
一個執行緒通常代表了一個多執行緒。
一個執行緒通常被表示為一個存盤背景關系的資料結構。調度器保留了一個當前 "可運行 "的執行緒結構的串列。如果一個執行緒被從 "可運行 "串列中洗掉,它將不會被調度到任何可用的 CPU 上運行。
互斥通常被實作為對擁有互斥的執行緒結構的參考,以及正在等待它的執行緒串列。一個執行緒不能同時出現在等待串列和調度器的可運行串列中。因此,等待突變的執行緒不能被調度,也不能占用CPU資源。
。這里有一些注意事項和細節。例如,在一個多 CPU 系統中,mutex 的實作實際上可能允許在被置于等待佇列之前有一段短暫的 "旋轉等待"。這涵蓋了這樣的情況:一個鎖可能只被另一個CPU上的另一個執行緒短暫持有,在這種情況下,完全的背景關系切換可能會更昂貴。不過一般來說,你可以假設一個被阻塞的執行緒從調度器的角度來看是無法運行的。
uj5u.com熱心網友回復:
不,在互斥上的等待并不使用CPU時間。突變體是在內核中實作的,所以它會讓執行緒進入睡眠狀態,直到突變體被解鎖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325322.html
標籤:
上一篇:在java中多執行緒的簡單問題
