谁是CreateTimerQueueTimer()设置的回调函数的调用线程?

时间:2013-11-04 00:16:32

标签: windows multithreading operating-system scheduling

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

定时器回调只能在创建它的线程的上下文中执行,如果该线程在收到某种信号时处于执行回调的位置。对于这些计时器,APC对于创建线程是QUEUED,如果该线程在其中一个“可警告”等待调用上被阻塞,它将立即就绪,在有可用于运行它的核心时运行。 APC运行后,等待呼叫将返回。如果等待调用不是SleepEx(),它将返回WAIT_IO_COMPLETION - 通常被忽略的结果。如果线程在APC排队时没有等待,则在线程进行下一次等待调用之前不会执行(显然 - 因为线程必须关闭其他操作:)。

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