簡體   English   中英

替代std :: this_thread :: sleep_for()

[英]alternative to std::this_thread::sleep_for()

我有一個循環,我想確保它在每個循環中(大約)固定的時間運行。

我正在使用sleep_for來實現此行為,但我也希望該程序能夠在不完全支持標准線程庫的環境下進行編譯。 現在我有這樣的事情:

using namespace std;
using namespace std::chrono;

//
while( !quit )
{
    steady_clock::time_point then = steady_clock::now();

    //...do loop stuff

    steady_clock::time_point now = steady_clock::now();
#ifdef NOTHREADS
    // version for systems without thread support
    while( duration_cast< microseconds >( now - then ).count() < 10000 )
    {
        now = steady_clock::now();
    }

#else
    this_thread::sleep_for( microseconds{ 10000 - duration_cast<microseconds>( now - then ).count() } );
#endif

}

盡管這使程序可以在不支持標准線程的環境中進行編譯,但它也非常占用CPU資源,因為程序會不斷檢查時間條件,而不是等到它成立為止。

我的問題是:在不完全支持線程的環境中,是否有一種資源占用較少的方法僅使用標准C ++(即不增強)來啟用這種“等待”行為?

有許多基於時間的功能,這在很大程度上取決於您所使用的操作系統。

Microsoft API提供了Sleep()(大寫S),可為您提供毫秒級的睡眠。

在Unix(POSIX)下,您具有nanosleep()。

我認為這兩個功能應該可以使您在大多數計算機上運行。

實現將使用相同的循環,但在while()循環中要多睡一會。 那將仍然是一個類似池的事情,但是 速度更快 ,CPU占用更少。

同樣,如nm所提到的,select()具有該功能。 實施起來有些復雜,但是隨着時間的流逝,它有望返回。

暫無
暫無

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

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