这是我在这里的第一篇文章,提前感谢您的宽容。
我有一个带有作业队列>>线程数的线程池。
工艺流程:
- 初始化线程池(M个线程)
- 将N个任务放入队列(N可以是>> M)
- 线程开始执行任务;完成当前任务线程后自动执行下一个可用任务。
- 同步点 - 所有任务都必须完成。
- 数据处理(单线程)
- 根据处理后的数据生成任务或退出
- 转到 2
问题是同步点。我已经使用 counter 和 mutex 实现了简单的信号量:在第 2 步计数器初始化之前,使用要加载的任务数以及每个任务完成时计数器递减。如果计数器 == 零,那么我从工作线程发送 pthread_cond_signal,并且在第 4 步的 pthread_cond_wait 捕获它。
我觉得它不是最有效的方法(我不喜欢在每个线程中锁定/解锁以进行计数器递减,这是一个很大的开销,尤其是在任务有效负载很小的情况下),但不知道如何改进。我知道障碍,但我不能在线程中使用 pthread_barrier_wait,因为它们必须在同步事件发生之前多次重用。
pthread_spin_lock 队列中的任务数?即使队列为空,也不意味着线程没有运行——它们可能在最后 M 个任务上。我无法加入线程,因为它们将在下一个周期中重复使用。
我将不胜感激任何输入/想法。谢谢你。