深入分析Sleep 0 與Sleep 1 的區別

2021-06-26 13:27:59 字數 1004 閱讀 6291

深入分析sleep(0)與sleep(1)的區別

羅朝輝 (

目的:

有時候我們想讓執行緒不被排程一定的時間,也就是說讓執行緒睡眠一段時間。

api 介面:

在 win32中可以呼叫 sleep,sleepex 和 switchtothread 三個api。

void winapi sleep(dword dwmilliseconds);

dword winapi sleepex(dword dwmilliseconds, bool balertable);

bool winapi switchtothread();

在託管**中,我們可以呼叫靜態方法 thread.sleep。

分析:

sleep 介面均帶有表示睡眠時間長度的引數 timeout。呼叫以上提到的 sleep 介面,會有條件地將呼叫執行緒從當預處理器上移除,並且有可能將它從執行緒排程器的可執行佇列中移除。這個條件取決於呼叫 sleep 時timeout 引數。

當 timeout = 0, 即 sleep(0),如果執行緒排程器的可執行佇列中有大於或等於當前執行緒優先順序的就緒執行緒存在,作業系統會將當前執行緒從處理器上移除,排程其他優先順序高的就緒執行緒執行;如果可執行佇列中的沒有就緒執行緒或所有就緒執行緒的優先順序均低於當前執行緒優先順序,那麼當前執行緒會繼續執行,就像沒有呼叫 sleep(0)一樣。

當 timeout > 0 時,如:sleep(1),會引發執行緒上下文切換:呼叫執行緒會從執行緒排程器的可執行佇列中被移除一段時間,這個時間段約等於 timeout 所指定的時間長度。為什麼說約等於呢?是因為睡眠時間單位為毫秒,這與系統的時間精度有關。通常情況下,系統的時間精度為 10 ms,那麼指定任意少於 10 ms但大於 0 ms 的睡眠時間,均會向上求值為 10 ms。

由上面的分析可以看出,如果我們想讓當前線**正睡眠一下子,最好是呼叫 sleep(1) 或 switchtothread()。

深入分析Sleep 0 與Sleep 1 的區別

深入分析sleep 0 與sleep 1 的區別 羅朝輝 目的 有時候我們想讓執行緒不被排程一定的時間,也就是說讓執行緒睡眠一段時間。api 介面 在 win32中可以呼叫 sleep,sleepex 和 switchtothread 三個api。void winapi sleep dword dw...

《Linux diff與patch的深入分析》

diff的輸出格式分為傳統格式和統一格式 1 diff的傳統格式輸出.cat before.txt 輸出 this is a line to be deleted this is a line that will be changed this is a line that will be unch...

go restful實戰與深入分析之使用篇

go restful實戰與深入分析之使用篇package main 很簡單,users的一套curd。這裡面有幾個點說一下,首先需要定義乙個web container的容器wscontainer,然後把webservice放到容器裡面,可以理解成乙個container裡面有很多的webservice...