【问题标题】:What is a good way to prioritize threads waiting on the same blocking operation in C++?在 C++ 中优先考虑等待同一阻塞操作的线程的好方法是什么?
【发布时间】:2014-03-26 09:45:04
【问题描述】:

只有一个阻塞队列。有一个相同的工人池,当某些东西被推入队列时,它们只是等待条件变量,并尝试从队列中弹出。假设队列包含任务。

在理想情况下,线程会统一弹出任务。我想为该概率添加一些偏差,以便每个工人将弹出任务总量的一定百分比 - 根据它的优先级。但是,如果队列中有未处理的任务,则不应有任何线程故意空闲。

简单的例子。

有 3 个 worker,111 个任务,每秒一个任务进入队列。每个任务大约需要 1 秒的时间来处理。工人的优先级是 10、1、100。然后工人应该分别弹出 大约 10、1 和 100 个任务。


有没有使用标准条件变量和互斥锁实现这种机制的便捷方法? - 概率方法很好。

【问题讨论】:

  • 不加线程优先级,只给每个线程自己的队列,让任务经销商按照你的优先级规则处理任务?
  • @Malkocoglu 然后我必须实现任务窃取机制以防止单个线程的饥饿。这就是我要避免的。
  • 您可以添加一个“代理”,它是唯一通知新任务的;然后它可以根据工人优先级分配工作
  • @Sga: 但是这个代理怎么知道谁有空呢?从本质上讲,您似乎是在建议重新实现具有内置优先级方面的条件变量。
  • @Sga 那是我的错 - 我必须重新提出这个问题。但是 Matthieu M. 明白了:如果线程处于空闲状态,则不应等待,但如果单个任务有多个待处理线程,则优先级应该生效。

标签: c++ multithreading algorithm c++11 thread-priority


【解决方案1】:

创建一个priority_queue 的等待线程。当有新任务加入任务队列时,从priority_queue中弹出min线程来处理新任务。

【讨论】:

  • 所以,简而言之:创建一个条件变量,但用等待线程的优先级列表替换等待线程列表:)
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多