何时使用QueueUserAPC()?

时间:2011-12-18 10:01:16

标签: c multithreading winapi

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

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

1 个答案:

答案 0 :(得分:16)

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

假设您有一个主线程和一个工作线程。工作线程打开到文件服务器的套接字,并通过在循环中调用recv()开始下载10GB文件。主线程希望工作线程在等待网络数据包时在其停机时间做其他事情;它可以将一个函数排队,以便在工作程序上运行,否则它将等待并且什么都不做。

你必须小心使用APC,因为在我提到的场景中你不想再进行另一个阻塞的WinSock调用(这会导致未定义的行为)。你真的必须注意才能找到这个功能的任何好用途,因为你可以用其他方式做同样的事情。例如,让其他线程在每次要进入休眠状态时检查一个事件,而不是在等待时给它一个运行的函数。显然,在这种情况下,APC会更简单。

就像当你有一个电话台员工坐着等待电话,而你在停机期间给那个人很少的任务。 “在这里,在你等待的时候解决这个魔方。”虽然,当一个电话打进来时,该人不会放下魔方接听电话(APC必须在线程返回等待之前返回)。

如果有一个负责某种数据结构的线程(线程A),并且你想从另一个线程(线程B)对数据结构执行某些操作,那么

QueueUserAPC也很有用,但是您不希望尝试在两个线程之间共享该数据时产生同步开销/复杂性。通过让线程B对在线程A上运行的操作进行排队,线程A只维护该结构,您可以在该数据上执行任何您想要的任意函数,而无需担心同步。

它只是一个像线程池这样的工具。但是,对于线程池,您无法将任务发送到特定线程。您无法控制工作的完成位置。排队可能最终创建全新线程的任务时。您可以将两个任务排队,并在两个不同的线程上同时完成。使用QueueUserAPC,您可以保证任务按顺序完成,也可以在您指定的主题上完成。