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