我猜这是创建计时器的线程,比如 A。但我无法弄清楚回调函数是如何被调用的。假设计时器到期,然后会发生什么?当这个线程得到它的时间片时会发生这种情况吗?如果是这种情况,我认为该函数应该由调度程序调用或者在上下文最终切换到A之前,那么我可以说A是调用者吗?
谢谢。
我猜这是创建计时器的线程,比如 A。但我无法弄清楚回调函数是如何被调用的。假设计时器到期,然后会发生什么?当这个线程得到它的时间片时会发生这种情况吗?如果是这种情况,我认为该函数应该由调度程序调用或者在上下文最终切换到A之前,那么我可以说A是调用者吗?
谢谢。
计时器回调也可以由池线程、专门管理计时器的线程或在创建线程的上下文中调用(创建线程旨在接受和处理“异步过程调用”)。CTQT() 中的标志参数控制计时器到期时的操作。
如果计时器事件由池线程或计时器管理器线程调用,则该线程将在到期时准备好,并且当有可用于运行它的内核时,它将在其自己的上下文中“立即”进行回调。如果它愿意,创建定时器的线程可以等待一个同步对象(事件或信号量),该对象可以由定时器回调发出信号(即正常的线程间通信)。
定时器回调只能在创建它的线程的上下文中执行,前提是该线程在接收到某种信号时能够执行回调。在这些计时器的情况下,APC 被排队到创建线程,如果该线程在“可警报”等待调用之一上被阻塞,它将立即准备好,当有可用于运行它的内核时运行。APC 运行后,等待调用将返回。如果等待调用不是 SleepEx(),它将返回 WAIT_IO_COMPLETION - 通常被忽略的结果。如果在 APC 排队时线程没有等待,则在线程进行下一次等待调用之前不会执行它(显然 - 因为线程必须停止做其他事情:)。
“如果是这种情况,我认为函数应该由调度程序调用,或者在上下文最终切换到 A 之前,我可以说 A 是调用者吗?” 不!