GetThreadtimes给出了奇怪的结果

时间:2011-04-08 14:21:45

标签: c++ windows timing


我每隔5微秒(或多或少)使用GetThreadTimes监视一个线程 该线程为“Sleeping”1分钟但由于某种原因,有时我从GetThreadTimes获得的“用户时间”发生了变化,即使该线程仍处于睡眠模式。 内核时间始终为0.

有人知道为什么会这样吗? 谢谢:))

3 个答案:

答案 0 :(得分:5)

5微秒?!

GetThreadTimes()测量线程在休眠,用户/内核模式下花费的量子数。我在Win32上观察到10-15ms的典型调度程序量。在一个量子以下,你会发现时间GetThreadTimes()报告没有改变 - 它基本上只是将经过时间的量子(在每个状态中)的(整数)乘以一个量子的持续时间。

在10-15毫秒之内,你真的不能指望GetThreadTimes()返回的任何值是准确的。经常非常,您只会看到一次更新三个测量值中的一个;正如你所讨论的那样。

Linux和Win32在您讨论的规模上都有奇怪的线程运行时报告行为。我发现的唯一能够真正测量低至5微秒的预定执行时间的操作系统是Mac OS X和VxWorks - QNX也可能具有此功能。

答案 1 :(得分:2)

这不是完整的答案,但无论如何这里至少有两个原因:

  1. 众所周知的问题“Thread priority inversion”,有关详细信息,请参阅链接,但解决问题的非常有用的技术是随机提升线程。因此,线程有可能获得一些处理器时间。

  2. 线程休眠可以实现为循环,定期检查时间到期条件。

答案 2 :(得分:0)

来自MSDN:线程创建和退出时间是指自1601年1月1日午夜在英格兰格林威治时间过去的时间点。应用程序可以使用多种函数将这些值转换为更常用的形式;见时间函数。

所以它可以显示你离开主题的时间。