这是我在这里的第一篇帖子,谢谢你的宽容。
我有一个带有作业队列的线程池,>>线程数。
工艺流程:
问题是同步点。我使用计数器和互斥实现了简单的信号量:在步骤2之前,计数器被初始化为要加载的任务数,以及当每个任务完成时计数器会减少。如果计数器==为零,则从工作线程发送pthread_cond_signal,第4步的pthread_cond_wait捕获它。
我觉得这样做并不是最有效的方法(我不喜欢在每个线程中锁定/解锁以减少开销,特别是在任务有效负载很小的情况下),但是我不知道如何改进。我知道障碍,但是我不能在线程中使用pthread_barrier_wait,因为在同步事件发生之前,它们必须被重用多次。
队列中任务数的pthread_spin_lock?即使队列是空的,也不意味着线程没有运行--它们可能在最后一个M任务上。我不能连接线程,因为它们将在下一个循环中被重用。
如有任何意见或意见,我将不胜感激。谢谢。
发布于 2013-01-23 08:53:55
那么,您可以对其进行一些优化,也许可以使用原子减量指令,而不是计数器上的内核锁--然后,将计数器减少到零的线程可以调用一些‘OnComplete(某事)’方法/函数,这个方法/函数可能会向原始线程发出信号(就像现在所做的那样)。
不管您如何设计队列和屏障/会合,都不值得线程处理琐碎的任务。通常会有两个上下文--不管怎么说,当您的原始线程进入等待时,以及当它在任务完成后再次运行时,如果池不繁忙,并且池线程在队列中被阻塞,则会发生更多的变化。在完成计数上旋转会从CPU池中吸走一个核心--不太可能有太大帮助(特别是如果您设计池并行运行多个任务集--将有多个起始线程旋转)。
不要将CPU线程--仅限于琐碎的任务。如果有大量的CPU工作要做,或者任务执行阻塞操作,并且有更多的线程,而不是核心,那就好。
https://stackoverflow.com/questions/14465502
复制相似问题