【问题标题】:Does SetThreadpoolCallbackPriority work for IO callbacksSetThreadpoolCallbackPriority 是否适用于 IO 回调
【发布时间】:2016-11-07 20:58:29
【问题描述】:

Win32 API 有一个名为SetThreadpoolCallbackPriority() 的函数(实际上是一个宏)。

我想将它用于线程池 I/O 回调。 documentation 很稀疏,但提到了“工作项”。除了this blog entry 之外,Google 并没有找到很多示例,它再次谈到了“工作项”。

优先级实际上是否适用于 I/O?如果是,我该如何正确使用它?

【问题讨论】:

  • 当你尝试使用它时会发生什么?
  • 没有什么不好的事情发生,我只是在基准测试中看不到任何影响,因此我在问。我在创建 IO 后执行 SetThreadpoolCallbackPriority() 以临时提升某些客户端的回调
  • 定义“IO回调”?
  • PTP_WIN32_IO_CALLBACK ,如此处的 CreateThreadpoolIo 文档中所述 msdn.microsoft.com/en-us/library/windows/desktop/…

标签: c++ winapi threadpool


【解决方案1】:

优先级实际上是否适用于 I/O

不,这仅对通过调用 SubmitThreadpoolWork 排队的工作项有效。您的链接中提到的绝对正确程度 -

该函数不修改线程优先级;相反,它使用 低优先级、高优先级和正常优先级工作项的单独队列

所以调用 SetThreadpoolCallbackPriority 只是间接方式将 TP_CALLBACK_PRIORITY 优先级参数传递给函数 SubmitThreadpoolWork(Work)。因为我看起来更合乎逻辑的是直接执行此操作并具有下一个签名 -

VOID WINAPI SubmitThreadpoolWork(
  __inout  PTP_WORK pwk, TP_CALLBACK_PRIORITY Priority
);

将此与下一个函数进行比较 - IoQueueWorkItem - SetThreadpoolCallbackPriority 它用户模式模拟和参数 WORK_QUEUE_TYPE QueueType - 如 TP_CALLBACK_PRIORITY 优先级 - 说明哪个队列(存在 3 个不同队列)插入工作项。对于 I/O 项目,这当然没有任何影响。当工作线程删除项目时 - 它首先将其从高优先级中删除,使用它不为空,然后从正常,最后从低

【讨论】:

  • 谢谢!如果这不起作用,那将是很遗憾的。不知道线程池实现的内部结构,但我可以想象,如果它使用 GetQueuedCompletionStatusEx 将 OVERLAPPED 分批出队,它可以对出队的 IO 进行一些优先级排序。我剩下的唯一选择是将出队的项目洗牌到优先工作队列中,而不是直接在它到达的线程中处理它,对吧?
  • 不,当 IO de queued 它刚刚调用时,您需要 IO 项目的优先级?
  • 这不容易解释。想象一下,这是在数据库服务器内部,我知道这个客户端连接持有一些其他连接正在等待的重要锁,直到当前事务结束。所以我想提升这个连接,让它更快地完成,而不是让其他连接等待锁定
  • 明白,但这与出队顺序/优先级有什么关系?您在池中有多个线程(通常 = 处理器数),线程出队网络操作已完成(连接/接收/发送)并处理请求。按什么顺序并不重要。如果某些请求需要更多时间并持有锁 - 这里的任何优先级如何提供帮助?
  • 客户端在多个请求上持有锁,直到 COMMIT/ROLLBACK 到达。因此,如果我将此客户端的请求优先于其他请求,则其他客户端可能不必等待锁定。这只是防止了锁竞争,提高了并发性,减少了池中的线程数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2012-08-06
  • 2017-04-14
  • 1970-01-01
  • 2014-06-23
  • 2011-04-12
相关资源
最近更新 更多