[英]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.