同时获取steady_clock和system_clock

时间:2018-01-09 09:37:08

标签: c++ synchronization chrono

我的代码如下:

// Next 2 lines should be at the same time
auto nowMonotonic = std::chrono::steady_clock::now();
auto nowSystem = std::chrono::system_clock::now();

// Do some calc with nowMonotonic and nowSystem

这可能发生:

auto nowMonotonic = std::chrono::steady_clock::now();
// Some other thread/process interrupts this thread for an 
// unspecific amount of time...
auto nowSystem = std::chrono::system_clock::now();

// Do some calc with nowMonotonic and nowSystem

我正在研究(非实时)Linux系统。我正在根据当前steady_clock和当前system_clock进行一些计算。结果优于两个时钟读数之间的抖动。

在(几乎)同时读取两个时钟的最佳方法是什么?

是否有特殊的系统调用来执行此操作?是否有可能在单个系统调用中获得这两个时钟的差异?

1 个答案:

答案 0 :(得分:2)

没有办法完美地做到这一点,甚至没有最好的办法。你展示的方式是一种好方法。如果你愿意交易一些运行时间,你可以通过在每个时钟上多次调用now()并对结果取平均值来统计意义上获得更好的准确度。

例如:

std::pair<std::chrono::steady_clock::time_point,
          std::chrono::system_clock::time_point>
combined_now()
{
    using namespace std::chrono;
    auto u0 = system_clock::now();
    auto t0 = steady_clock::now();
    auto t1 = steady_clock::now();
    auto u1 = system_clock::now();
    return {t0 + (t1-t0)/2, u0 + (u1-u0)/2};
}

这不一定比你拥有的更好。但它是工具箱中另一个需要注意的工具。与往常一样,使用特定用例的测试来确定最适合您的方法。