在使用 nanosleep 的時候,我們需要檢查回傳值來檢測我們是否被信號打斷了:
while ((nanosleep(&rqtp, &rmtp) == -1) && (errno == EINTR))
{
if (rmtp.tv_nsec != 0 || rmtp.tv_sec != 0)
{
rqtp = rmtp;
continue; /* Wait again when interrupted by a signal handler */
}
}
我想使用std::this_thread::sleep_for()而不是nanosleep(). 是否有可能呼叫this_thread::sleep_for()也被中斷(按規定提前結束)?
uj5u.com熱心網友回復:
如果你使用 GCC 的 libstdc ,你可以在這里找到對應的代碼:
while (::nanosleep(&__ts, &__ts) == -1 && errno == EINTR)
{ }
與相應的timespec __ts準備。所以它基本上和你的代碼回圈做同樣的事情,并在信號中斷后重新啟動睡眠。
C 標準本身說:
名稱以 _for 結尾的函式采用指定持續時間的引數。這些函式產生相對超時。實作應該使用穩定的時鐘來測量這些功能的時間。給定一個持續時間引數 Dt,超時的實時持續時間是 Dt Di Dm。
其中 Di 和 Dm 是由實施和資源管理引入的延遲,如標準前一句所述。假設這些延遲是積極的(它們應該是積極的),睡眠時間總是至少與指定時間一樣長。
因此,在我看來,該標準保證睡眠不會提前結束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/533002.html
標籤:C linux
上一篇:Gruvbox顏色方案不適用
