同时获取steady_clock和system_clock

pow*_*ete 5 c++ synchronization c++-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
Run Code Online (Sandbox Code Playgroud)

这可能会发生:

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
Run Code Online (Sandbox Code Playgroud)

我正在(非实时)Linux 系统上工作。我正在根据 currentsteady_clock和 current进行一些计算system_clock。结果优于两个时钟读数之间的抖动。

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

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

How*_*ant 4

没有办法完美地做到这一点,甚至没有最好的办法。你所展示的方式是好方法之一。如果您愿意牺牲一些运行时间,则可以通过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};
}
Run Code Online (Sandbox Code Playgroud)

这不一定比您拥有的更好。但这是工具箱中另一个需要注意的工具。与往常一样,使用针对您的特定用例的测试来决定什么最适合您。