我确实了解APC是什么,它如何工作以及Windows如何使用它,但是我不了解我(作为程序员)何时应使用 QueueUserAPC 而不是使用光纤或线程池线程。

我什么时候应该选择使用QueueUserAPC,为什么?

最佳答案

QueueUserAPC是一个简洁的工具,通常可以用作某些由同步对象处理的任务的快捷方式。它允许您告诉特定线程在该线程方便的时候(例如,当它完成其当前工作并开始等待某件事时)执行某项操作。

假设您有一个主线程和一个工作线程。辅助线程打开文件服务器的套接字,并通过循环调用recv()开始下载10GB文件。主线程希望在等待网络数据包时让工作线程在停机期间执行其他操作。它可以将要在工作程序上运行的功能排队,否则它将处于等待状态而无所事事。

您必须小心APC,因为在我提到的情况下,您不想进行另一个阻塞的WinSock调用(这将导致未定义的行为)。您确实必须注意才能找到此功能的任何好用法,因为您可以用其他方式做同样的事情。例如,通过让另一个线程在每次即将进入休眠状态时检查一个事件,而不是赋予它在等待时运行的功能。显然,在这种情况下,APC会更简单。

就像您有一个电话服务台员工坐着等待电话,而您给该人员在停机期间几乎没有什么工作要做。 “在这里,等你的时候解决这个魔方。”尽管当有电话打进来时,此人不会放下魔方来接听电话(APC必须先返回,然后线程才能返回等待状态)。

如果只有一个线程(线程A)负责某些数据结构,并且您想从另一个线程(线程B)对数据结构执行某些操作,则QueueUserAPC也很有用,但是您不想拥有尝试在两个线程之间共享该数据的同步开销/复杂性。通过让线程B将要在线程A上运行的操作排队(该线程仅维护该结构),您可以在该数据上执行所需的任意函数,而不必担心同步。

它只是另一个工具,例如线程池。但是,对于线程池,您无法将任务发送到特定线程。您无法控制在何处完成工作。当您将一个任务排队时,可能最终会创建一个新线程。您可以将两个任务排队,并且它们在两个不同的线程上同时完成。使用QueueUserAPC,可以保证任务将按顺序完成并在您指定的线程上完成。

关于c - 什么时候使用QueueUserAPC()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8551004/

10-10 14:56