我明白APC是什么,它是如何工作的,以及
Windows如何使用它,但是当我(作为程序员)应该使用
QueueUserAPC
而不是说光纤或线程池线程时,我不明白.
我什么时候应该选择使用QueueUserAPC,为什么?
解决方法
QueueUserAPC是一个整洁的工具,通常可以是某些任务的快捷方式,否则会使用同步对象来处理这些任务.它允许你告诉一个特定的线程做某事,只要它方便的线程(即当它完成当前的工作并开始等待某事).
假设你有一个主线程和一个工作线程.工作线程向文件服务器打开套接字,并通过在循环中调用recv()开始下载10GB文件.主线程想让工作线程在等待网络数据包时在其停机时间内执行其他操作;它可以将一个函数排队在工作器上运行,否则它将等待并且什么都不做.
您必须小心APC,因为在我提到的情况下,您不会想要另外阻止WinSock调用(这将导致未定义的行为).你真的必须观看,以便找到这个功能的任何好的用途,因为你可以用其他方式做同样的事情.例如,通过让其他线程在每次即将进入睡眠状态时检查事件,而不是给它一个在等待时运行的功能.显然,APC在这种情况下会更简单.
就像当你有一个电话桌员工坐在等待打电话的时候,你给这个人在停机期间做一些小小的工作. “在这里,你在等待时解决这个魔方.”虽然打电话时,该人不会放下魔方来接听电话(APC必须在线程返回等待之前返回).
如果有一个线程(线程A)负责一些数据结构,并且您想对另一个线程(线程B)的数据结构执行一些操作,则QueueUserAPC也很有用,但是您不想拥有尝试在两个线程之间共享该数据的同步开销/复杂性.通过让线程B将操作队列到线程A上运行的操作,该线程仅仅维护该结构,您正在执行任何您想要的任意函数,而无需担心同步.
它只是另一个工具,如线程池.但是,使用线程池不能将任务发送到特定的线程.你无法控制工作的完成.当你排队一个可能最终创建一个全新的线程的任务.您可以排队两个任务,并在两个不同的线程上同时完成.使用QueueUserAPC,您可以确保任务按顺序和您指定的线程完成.