【发布时间】:2014-06-22 12:58:10
【问题描述】:
我实现了一个返回时间的快速函数(使用 rdtsc),我们称之为fast_time()。我有一个使用系统调用的原始函数作为参考,我们称之为system_time()。我的程序使用fast_time(),但在一个单独的线程中,我不断地运行一个while循环来检查从我的函数返回的时间与原始函数之间的差异是否大于预定义的阈值。类似的东西
while (true)
{
if (abs((fast_time() - system_time()).microseconds()) > MICROSECONDS_THRESHOLD)
{
report error
}
}
通常我看不到错误,但有时我确实得到了错误,我想更好地理解这个问题。我的第一个怀疑是对system_time() 的调用不会在fast_time() 返回后立即发生。如何强制程序尽可能“原子地”执行fast_time() - system_time()?
【问题讨论】:
-
您好,在我回答之前,您的代码是否锁定在单个 CPU 上?如果你不知道那是什么意思也没关系,只要告诉我从哪里开始解释:-)
-
除非您在实时内核上运行(Linux 不是),否则您无法保证您的软件运行的频率,也无法知道线程是否会运行轮流在同一个核心上运行,或者在不同的核心上运行。通常这完全取决于操作系统。
-
@LtWorf 实际上,如果您选择使用它,Linux 确实有一个实时调度程序,并且在他的多核 CPU 上的特殊情况下,他可以将他的线程锁定到一个 CORE 并获得他正在寻找的结果。
-
我用
sched_setaffinity将线程锁定到单个核心,是的,我知道我没有得到调度的保证(我不使用实时内核),我的问题是,我能做些什么来解决这个问题? -
你想通过测试达到什么目的?它是对您信任的
system_time实现的fast_time实现的测试吗?
标签: c++ linux time system-calls rdtsc