QueueUserAPC是一个简洁的工具,通常可以用作某些通过同步对象处理的任务的快捷方式。它允许您告诉特定线程在该线程方便的时候(即何时完成其当前工作并开始等待某件事)执行某项操作。
假设您有一个主线程和一个工作线程。辅助线程打开文件服务器的套接字,并通过循环调用recv()开始下载10GB文件。主线程希望在等待网络数据包时让工作线程在停机期间执行其他操作。它可以将要在工作程序上运行的功能排队,否则它将等待并且什么也不做。
您必须小心APC,因为在我提到的情况下,您不想进行另一个阻塞的WinSock调用(这将导致未定义的行为)。您确实必须注意才能找到此功能的任何好用法,因为您可以通过其他方式来做同样的事情。例如,通过让另一个线程在每次即将进入睡眠状态时检查一个事件,而不是赋予它在等待时运行的功能。显然,在这种情况下,APC会更简单。
就像您有一个电话服务台员工坐着等待电话,而您却给该人员在停机期间几乎没有什么工作要做。 “在这里,等你的时候解决这个魔方。”尽管当有电话打进来时,此人不会放下魔方来接听电话(APC必须返回,线程才能返回等待状态)。
如果只有一个线程(线程A)负责某些数据结构,并且您想要对另一个线程(线程B)的数据结构执行某些操作,则QueueUserAPC也很有用。尝试在两个线程之间共享数据的同步开销/复杂性。通过让线程B将要在线程A上运行的操作排队(该线程仅维护该结构),您可以在该数据上执行所需的任意函数,而不必担心同步。
它只是另一个工具,例如线程池。但是,对于线程池,您无法将任务发送到特定线程。您无法控制在哪里完成工作。当您将一个任务排队时,可能最终会创建一个新线程。您可以将两个任务排队,并且它们同时在两个不同的线程上完成。使用QueueUserAPC,可以保证任务将按顺序完成并在指定的线程上完成。