我每隔5微秒(或多或少)使用GetThreadTimes
监视一个线程
该线程为“Sleeping
”1分钟但由于某种原因,有时我从GetThreadTimes
获得的“用户时间”发生了变化,即使该线程仍处于睡眠模式。
内核时间始终为0.
有人知道为什么会这样吗? 谢谢:))
答案 0 :(得分:5)
5微秒?!
GetThreadTimes()
测量线程在休眠,用户/内核模式下花费的量子数。我在Win32上观察到10-15ms的典型调度程序量。在一个量子以下,你会发现时间GetThreadTimes()
报告没有改变 - 它基本上只是将经过时间的量子(在每个状态中)的(整数)乘以一个量子的持续时间。
在10-15毫秒之内,你真的不能指望GetThreadTimes()
返回的任何值是准确的。经常非常,您只会看到一次更新三个测量值中的一个;正如你所讨论的那样。
Linux和Win32在您讨论的规模上都有奇怪的线程运行时报告行为。我发现的唯一能够真正测量低至5微秒的预定执行时间的操作系统是Mac OS X和VxWorks - QNX也可能具有此功能。
答案 1 :(得分:2)
这不是完整的答案,但无论如何这里至少有两个原因:
众所周知的问题“Thread priority inversion”,有关详细信息,请参阅链接,但解决问题的非常有用的技术是随机提升线程。因此,线程有可能获得一些处理器时间。
线程休眠可以实现为循环,定期检查时间到期条件。
答案 2 :(得分:0)
来自MSDN:线程创建和退出时间是指自1601年1月1日午夜在英格兰格林威治时间过去的时间点。应用程序可以使用多种函数将这些值转换为更常用的形式;见时间函数。
所以它可以显示你离开主题的时间。