C ++ - 线程和多个队列

时间:2009-05-22 16:57:14

标签: c++ multithreading queue posix pthreads

我需要构建一个工作系统(表示为线程)和(多个)队列。单个作业正在其中一个队列中等待,并等待工作线程处理它们。每个工作人员只能处理一些队列中的作业。没有旋转等待。 C / C ++,pthreads,标准POSIX。

对我来说问题是“多个队列”的事​​情。我知道如何用一个队列来实现它。工作人员需要等待他们可以处理的所有队列(等待其中的任何队列)。

在Windows上,我会使用WaitForMultipleObjects,但这需要是多平台的。

我不想要任何特定的代码,只需要我应该使用的模型的提示或描述。提前谢谢。

8 个答案:

答案 0 :(得分:5)

怎么样:

  • 所有工作线程都在等待信号量
  • 当任何内容被添加到队列中时,信号量会递增,从而唤醒单个线程
  • 线程检查它感兴趣的队列,处理其中一个并返回等待信号量

您需要额外的互斥锁才能控制实际的读数和读数。写入队列。

答案 1 :(得分:4)

您可以使用condition variable。让您的工作线程等待条件变量。将作业添加到任何作业队列时,请通知条件变量。然后,当工作线程唤醒时,它会检查它正在等待的队列。如果他们中的任何一个人有一份工作,就会把这份工作从队列中拿走。否则,它会返回等待条件变量。等待条件变量会使线程进入休眠状态,因此不会占用CPU时间。

当然,不言而喻,您应该使用互斥锁(例如pthread_mutex_t)保护对作业队列的所有访问。

答案 2 :(得分:1)

如果每个队列的工作人员不多,您可以为每个工作人员创建一个条件变量。

答案 3 :(得分:0)

听起来你应该使用boost::threadboost::conditionstd::queue

答案 4 :(得分:0)

我要做的是使用boost :: asio来排队数据,这样你的多个线程就可以了。您可以通过post命令将ref传递给队列,并相应地进行线程处理。

答案 5 :(得分:0)

为什么不为所有队列设置一个锁,而不是为每个队列设置单独的锁?

  1. 等待锁定
  2. 获取锁定
  3. 从任何队列中出列
  4. 解除锁定
  5. 处理出列项目
  6. 转到第1步
  7. 假设出队的时间可以忽略不计(因此只能在可忽略的时间内保持锁定),可能不需要多次锁定。

答案 6 :(得分:0)

您可以执行以下操作:每个作业都有一个与之关联的“队列”。例如:

假设您有2个队列。你的工作可以说:

job[0].queue = 1; /* That job is in queue 1 */
job[1].queue = 1;
job[2].queue = 2; /* this job is in queue 2 */
... 
etc

那么你有你的“线程包”。一个线程只是选择一份工作 - 比如工作[2]。如果该线程只允许从队列1处理作业,那么它会将该作业放回就绪队列并选择不同的作业。

因此每个线程都知道允许哪些队列处理,当它选择一个作业时,它确保作业的“队列”字段匹配。如果没有,它会选择不同的工作。

(这在许多方面都是如何在多核上的linux中进行进程调度。每个进程都有一个位掩码,说明允许哪些处理器运行,然后处理器确保“允许”之前运行该进程这样做。)

答案 7 :(得分:0)

我最近一直在考虑这个问题,我想出的唯一想法是(假设你有线程安全的队列)只有多个线程服务于一个队列。

然后,您可以让一个或多个工作生成线程,将作业添加到单个队列,并且一个或多个工作线程阻塞队列,直到找到要处理的内容。

如果您有多个工作线程必须轮询的多个队列,那么解决方案可能是为每个队列和一个额外队列添加一个额外的线程。额外的线程每个都在自己的单个队列中阻塞,但只是将作业转发到额外的队列。现在,现有的工作线程又回到了阻塞单个队列。