0

这是我在这里的第一篇文章,提前感谢您的宽容。

我有一个带有作业队列>>线程数的线程池。

工艺流程:

  1. 初始化线程池(M个线程)
  2. 将N个任务放入队列(N可以是>> M)
  3. 线程开始执行任务;完成当前任务线程后自动执行下一个可用任务。
  4. 同步点 - 所有任务都必须完成。
  5. 数据处理(单线程)
  6. 根据处理后的数据生成任务或退出
  7. 转到 2

问题是同步点。我已经使用 counter 和 mutex 实现了简单的信号量:在第 2 步计数器初始化之前,使用要加载的任务数以及每个任务完成时计数器递减。如果计数器 == 零,那么我从工作线程发送 pthread_cond_signal,并且在第 4 步的 pthread_cond_wait 捕获它。

我觉得它不是最有效的方法(我不喜欢在每个线程中锁定/解锁以进行计数器递减,这是一个很大的开销,尤其是在任务有效负载很小的情况下),但不知道如何改进。我知道障碍,但我不能在线程中使用 pthread_barrier_wait,因为它们必须在同步事件发生之前多次重用。

pthread_spin_lock 队列中的任务数?即使队列为空,也不意味着线程没有运行——它们可能在最后 M 个任务上。我无法加入线程,因为它们将在下一个周期中重复使用。

我将不胜感激任何输入/想法。谢谢你。

4

1 回答 1

0

好吧,你可以稍微优化一下,也许,通过使用原子递减指令而不是计数器上的内核锁 - 将计数器递减为零的线程然后可以调用一些“OnComplete(something)”方法/函数,也许,发信号给原始线程,(就像你现在正在做的那样)。

无论您如何设计队列和屏障/集合点,都不值得将琐碎的任务线程化。无论如何,当您的原始线程进入等待时,通常会有两次上下文更改,并且当它在任务完成后再次运行时,如果池不忙并且池线程在队列中被阻塞,则更多。旋转完成计数将从您的 CPU 池中吸出一个核心 - 不太可能有太大帮助,(特别是如果您将池设计为并行运行一组以上的任务 - 将会有多个原始线程在旋转) .

不要线程化 CPU-trivial-only 任务。如果有很多 CPU 工作要做,或者任务执行阻塞操作并且线程多于内核,那很好。

于 2013-01-23T08:53:55.127 回答