同时获取 steady_clock 和 system_clock

4

我的代码类似于:

// 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
在现代的抢占式多任务操作系统上,这是不可能的。如果您有一个带有实时调度的线程,则可能会实现(请参见例如sched_setscheduler以获取更多信息)。 - Some programmer dude
1个回答

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};
}

这并不一定比你现有的更好。但这是另一个工具箱中需要注意的工具。始终使用测试来确定适合您的特定用例的最佳解决方案。


虽然我很失望没有更好的解决方案,但我非常喜欢你的建议。你或者有人是否有一个半经验性的建议,可以说明统计平均的合理程度?例如,你只使用了2个数据点,但是在实验开始时或每天几次,可能愿意允许X秒来获得真正好的“同步性”... - BmyGuest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接