有没有一种方法可以丢弃APC队列?

3

我使用QueueUserAPC()函数将异步过程调用添加到线程的APC队列中。

假设我已经将10个调用排队到线程中,在线程进入SleepEx()之后执行其中一个调用时,出于某种原因,我决定不执行下一个APC。 我对这个问题的基本而简单的解决方案是将所有调用都包装在if块中,并检查一个全局变量,只有当设置了此条件变量时才执行该块。

是否有更好的方法来解决这个问题? 我能否丢弃线程的APC队列,以便其中排队的其他调用不会被调用?

1个回答

6

没有用户模式的方法可以从APC队列中删除项目。(你可以从内核模式中删除,但即使在那里,从APC队列中删除项目也只在拆卸情况下执行。) 无论如何,QueueUserAPC不返回可用的句柄,因此无法取消,完全刷新队列是一个坏主意,因为其他代码可能已经将您不知道的项目放入队列中。


我相信运行异步调用的线程必须有机会决定如何处理自己的队列。推送项目到队列的其他代码可能不知道该线程的内部状态。调用异步函数或放弃它们应该是线程的职责。但是,我认为可以实现自己的队列;只需要将代码排队以获取指向函数的指针、另一个参数和另一个等待函数的句柄。谢谢回复。 - Oregano
@Oregano - QueueUserAPC(用户模式异步过程调用队列)是根据 Raymond Chen 的说法,以“内核色眼镜”设计的。整个 APC 机制都是围绕着允许内核在线程阻塞时调用用户模式回调函数而构建的。 - Eric Brown
@EricBrown - 我甚至不确定你是否可以轻松地从内核模式中完成它。即使KeInsertQueueApc()是已导出函数,KeRemoveQueueApc()也不是。 - Benj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接