C++ std::this_线程::sleep_for()的替代方案

C++ std::this_线程::sleep_for()的替代方案,c++,c++11,C++,C++11,我有一个循环,我想确保它为每个循环运行(大约)固定的时间 我使用sleep\u for来实现此行为,但我也希望程序能够在不完全支持标准线程库的环境中编译。现在我有这样的事情: using namespace std; using namespace std::chrono; // while( !quit ) { steady_clock::time_point then = steady_clock::now(); //...do loop stuff stead

我有一个循环,我想确保它为每个循环运行(大约)固定的时间

我使用
sleep\u 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

}
使用名称空间std;
使用名称空间std::chrono;
//
而(!退出)
{
稳定的时钟::时间点然后=稳定的时钟::现在();
//…做循环运动
稳定的时钟::现在的时间点=稳定的时钟::现在();
#如果没有阅读
//不支持线程的系统的版本
while(持续时间<微秒>(现在-然后).count()<10000)
{
现在=稳定的时钟::现在();
}
#否则
此线程::sleep_for(微秒{10000-duration_cast(now-then).count()});
#恩迪夫
}
虽然这允许程序在不支持标准线程的环境中编译,但由于程序不断检查时间条件,而不是等待时间条件为真,因此它也非常占用CPU


我的问题是:在不完全支持线程的环境中,是否有一种资源密集型的方式来使用这种“等待”行为,即只使用标准C++(即不升压)?有很多基于时间的函数,这很大程度上取决于您正在使用的操作系统。 Microsoft API提供了Sleep()(大写字母S),可让您获得毫秒睡眠

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

我认为这两个功能应该可以让你在大多数计算机上运行

实现方法是使用相同的循环,但在while()循环中稍微休眠一点。这仍然是一个类似于池的东西,但速度更快,CPU占用更少


另外,正如n.m.所提到的,select()具有这种功能。只是实现起来有点复杂,但预计它会在时间流逝后返回。

据我所知不是这样,除非您使用
sleep\u,直到
。这将非常困难。如果您可以使用boost,那么有很多定时回调函数可以让您轻松地执行此操作。请参阅我以前在空FDSET上使用的
select
。如果支持,您也可以尝试内在的
yield
。感谢您的建议,我将研究这些替代方案。在这些特性得到广泛支持之前,使用C++11特性似乎需要有条件地使用替代方案(如本例所示)。