【问题标题】:Who is the calling thread of the callback function set by CreateTimerQueueTimer()?CreateTimerQueueTimer()设置的回调函数的调用线程是谁?
【发布时间】:2013-11-14 14:37:06
【问题描述】:

我猜是线程,比如 A,在其上创建了计时器。但我无法弄清楚回调函数是如何被调用的。假设计时器到期,然后会发生什么?当这个线程得到它的时间片时会发生这种情况吗?如果是这种情况,我认为该函数应该由调度程序调用或者在上下文最终切换到A之前,那么我可以说A是调用者吗?

谢谢。

【问题讨论】:

  • 在 MSDN 上查找 API。
  • 嗨,马丁。我看过msdn上的函数。但其实我想知道操作系统是如何实现这种特性的。

标签: windows multithreading operating-system scheduling


【解决方案1】:

计时器回调也可以由池线程、专门管理计时器的线程或在创建线程的上下文中调用(创建线程旨在接受和处理“异步过程调用”)。 CTQT() 中的标志参数控制定时器到期时的动作。

如果计时器事件由池线程或计时器管理器线程调用,该线程将在到期时准备好,并且当有可用于运行它的内核时,它将在其自己的上下文中“立即”进行回调.如果需要,创建定时器的线程可以等待一个同步对象(事件或信号量),该对象可由定时器回调发出信号(即正常的线程间通信)。

定时器回调只能在创建它的线程的上下文中执行,前提是该线程在接收到某种信号时能够执行回调。在这些计时器的情况下,APC 被排队到创建线程,如果该线程在“可警报”等待调用之一上被阻塞,它将立即准备好,当有可用于运行它的内核时运行。 APC 运行后,等待调用将返回。如果等待调用不是 SleepEx(),它将返回 WAIT_IO_COMPLETION - 通常被忽略的结果。如果 APC 排队时线程没有等待,则在线程进行下一次等待调用之前不会执行它,(显然 - 因为线程必须停止做其他事情:)。

'如果是这种情况,我认为函数应该由调度程序调用或者在上下文最终切换到 A 之前,那么我可以说 A 是调用者吗?不!

【讨论】:

  • 非常有启发性,我可能需要一些时间才能完全理解这一点。非常感谢马丁!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多