是否有忙等待条件或直到超时的标准功能

Is there a standard function to busy wait for a condition or until a timeout

我需要在我的程序中等待一个子系统。在不同的地方要等待不同的条件。我知道我还可以使用线程和条件变量。但是由于子系统(用 C 语言编程的裸机)是通过共享内存连接的,没有注册中断——一个线程无论如何都需要轮询。

所以我做了以下模板来等待任何事情。我想知道是否已经有一个可用于此的 STL 函数?

#include <chrono>
#include <thread>


//given poll interval
template<typename predicate, 
         typename Rep1, typename Period1, 
         typename Rep2, typename Period2> 
bool waitActiveFor(predicate check,
                   std::chrono::duration<Rep1, Period1> x_timeout,
                   std::chrono::duration<Rep2, Period2> x_pollInterval)
{
  auto x_start = std::chrono::steady_clock::now();
  while (true)
  {
    if (check())
      return true;

    if ((std::chrono::steady_clock::now() - x_start) > x_timeout)
      return false;

    std::this_thread::sleep_for(x_pollInterval);
  }
}

//no poll interval defined
template<typename predicate, 
         typename Rep, typename Period>
bool waitActiveFor(predicate check,
                   std::chrono::duration<Rep, Period> x_timeout)
{
  auto x_start = std::chrono::steady_clock::now();
  while (true)
  {
    if (check())
      return true;

    if ((std::chrono::steady_clock::now() - x_start) > x_timeout)
      return false;

    std::this_thread::yield();
  }
}

running sample


2019-05-23:关于评论和答案的代码更新

据我所知不是。一般来说,目标是在不消耗时钟周期的情况下等待,因此标准库适合这种用法。

我知道 std::this_thread::yield() 当我想忙等待时我通常使用它,但是由于你有轮询间隔,sleep_for() 可能是你最好的选择。

Is there a standard function to busy wait for a condition or until a timeout

没有。有阻塞直到超时或通知的功能,但没有忙碌等待的功能。但是,正如您所展示的那样,这确实很容易编写。

关于上下文的一个重要考虑因素:通常无法保证 check() 在函数返回 true 后仍然为 true。为了实现这一保证,您必须确保任何接触共享内存(包括子系统)的东西都不会将检查更改为假,除了执行轮询的线程(这意味着只能有一个线程这样做)。


奖金代码审查

  • 既然你有一个模板,那么让时间参数的类型也被模板化可能是个好主意,这样用户就可以使用任何 std::chrono::time_point,从而可以使用任何单位。此外,您可以去掉模板中的 duration_castcount