gpt4 book ai didi

c - 何时使用 QueueUserAPC()?

转载 作者:太空狗 更新时间:2023-10-29 16:34:02 28 4
gpt4 key购买 nike

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

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

最佳答案

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

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

您必须小心使用 APC,因为在我提到的场景中您不希望进行另一个阻塞的 WinSock 调用(这会导致未定义的行为)。您真的必须仔细观察才能发现此功能的任何良好用途,因为您可以通过其他方式做同样的事情。例如,让另一个线程在每次即将进入休眠状态时检查一个事件,而不是让它在等待时运行一个函数。显然,在这种情况下,APC 会更简单。

这就像您有一个电话服务台的员工坐着等电话,您在他们的停机时间给他们一些小任务。 “来,在你等的时候解开这个魔方。”虽然,当有电话进来时,对方不会放下魔方接电话(APC 必须返回,线程才能返回等待)。

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

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com