首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程:可重入/可重用线程的线程池同步方法?

线程:可重入/可重用线程的线程池同步方法?
EN

Stack Overflow用户
提问于 2013-01-22 18:27:49
回答 1查看 663关注 0票数 0

这是我在这里的第一篇帖子,谢谢你的宽容。

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

工艺流程:

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

问题是同步点。我使用计数器和互斥实现了简单的信号量:在步骤2之前,计数器被初始化为要加载的任务数,以及当每个任务完成时计数器会减少。如果计数器==为零,则从工作线程发送pthread_cond_signal,第4步的pthread_cond_wait捕获它。

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

队列中任务数的pthread_spin_lock?即使队列是空的,也不意味着线程没有运行--它们可能在最后一个M任务上。我不能连接线程,因为它们将在下一个循环中被重用。

如有任何意见或意见,我将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-01-23 08:53:55

那么,您可以对其进行一些优化,也许可以使用原子减量指令,而不是计数器上的内核锁--然后,将计数器减少到零的线程可以调用一些‘OnComplete(某事)’方法/函数,这个方法/函数可能会向原始线程发出信号(就像现在所做的那样)。

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

不要将CPU线程--仅限于琐碎的任务。如果有大量的CPU工作要做,或者任务执行阻塞操作,并且有更多的线程,而不是核心,那就好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14465502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档