替代std :: this_thread :: sleep_for()

时间:2013-06-27 02:24:25

标签: c++ c++11

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

我正在使用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 ++(即不提升)来实现这种“等待”行为的资源消耗较少的方式?

1 个答案:

答案 0 :(得分:2)

有许多基于时间的功能,它在很大程度上取决于您正在使用的操作系统。

Microsoft API提供Sleep()(大写字母S),为您提供毫秒睡眠。

在Unix(POSIX)下你有nanosleep()。

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

实现将使用相同的循环,但在while()循环中稍微睡一会儿。这仍然是一个像池一样的事情,但更快更少CPU密集。

另外,作为n.m.提到,select()具有该功能。实施起来有点复杂,但预计会在经过一段时间后返回。