【问题标题】:Does the windows scheduler skip threads that are in a waitable state? (waitable timer)Windows 调度程序是否跳过处于等待状态的线程? (等待计时器)
【发布时间】:2014-12-08 22:11:31
【问题描述】:

和标题说的差不多。如果线程或进程正在使用可等待计时器并且处于可等待状态,则使用

进行设置
DWORD WINAPI WaitForSingleObject(
  _In_  HANDLE hHandle,
  _In_  DWORD dwMilliseconds
);

调度程序是否会以与doingwork() 不同的方式处理它?即,如果调度程序为线程留出(例如)10ms 的时隙,但是当它查看线程并意识到它处于等待状态时,调度程序是否立即切换回允许下一个任务提前开始其时隙;或者它只是坐在那里并在这 10 毫秒内消耗 CPU 时间,就好像正在使用 sleep() 一样?我已尝试搜索以了解如何解决此问题,但找不到任何东西。

【问题讨论】:

  • 当然,调度器不关注等待线程。
  • 您有没有想过尝试一下?比如说,启动 32 个线程并让它们都在一个同步对象上等待。然后通过任务管理器查看 CPU 使用情况。它将是 0。
  • 我可以,但这就是为什么 SO 来这里是为了节省时间并从愿意提供帮助的人那里获取信息。如果我有时间在世界上,我会整天做实验,但我不会,所以我会尝试一些项目并询问其他项目的问题。

标签: multithreading winapi timer process


【解决方案1】:

等待线程不会被执行。如果您考虑一下,没有什么可以执行 - 线程正在等待,因此如果分配了 CPU 时间,它与 CPU 时间没有任何关系。

我认为您可能会感到困惑,因为您认为是线程在执行实际检查对象是否已准备好。所以你想象的方式,我假设,WaitForSingleObject() 是一个持续轮询的函数,并且在你的线程上下文中运行,调度程序为线程分配时间,因此线程本身可以轮询对象是否准备好了。

事实并非如此 - 是内核在检查这些对象,而线程本质上是挂起的。一旦对象准备好,调度器将“激活”线程并调度它执行。

【讨论】:

  • 内核甚至不需要做任何检查。系统调用向事件对象发出信号,使等待线程准备就绪,并可能“立即”运行。
猜你喜欢
  • 1970-01-01
  • 2018-01-17
  • 2014-01-31
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多