【问题标题】:Is there a way to discard an APC queue?有没有办法丢弃 APC 队列?
【发布时间】:2014-02-06 12:38:55
【问题描述】:

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

假设我已将 10 次调用排队到一个线程,并且在线程进入 SleepEx() 后执行其中一个调用时,出于某种原因,我决定不执行下一个 APC。我对这个问题的原始和简单的解决方案是使用 if 块检查全局变量来包装所有调用,并仅在设置(或未设置)此条件变量时执行该块。

有没有更好的方法来做到这一点?我可以丢弃一个线程的 APC 队列,这样队列中的其他调用就不会被调用吗?

【问题讨论】:

    标签: winapi asynchronous wait apc


    【解决方案1】:

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

    【讨论】:

    • 我相信运行异步调用的线程必须有机会决定如何处理自己的队列。其他将项目推送到队列的代码可能不知道该线程的内部状态。调用异步函数或丢弃它们应该是线程的责任。但是,我认为可以实现自己的队列;只需排队代码以获取指向函数的指针和另一个用于参数的指针,以及等待函数的另一个句柄。感谢您的回复。
    • @Oregano - QueueUserAPC(用 Raymond Chen 的话说)是用“有色眼镜”设计的。整个 APC 机制是围绕允许内核在线程被阻塞时调用用户模式回调而构建的。
    • @EricBrown - 我什至不确定你是否可以从内核模式轻松完成。 KeRemoveQueueApc() 不是导出函数,即使 KeInsertQueueApc() 是..
    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多