我正在使用线程池。因此,我正在寻找一种简单而有效的方式来通知父亲,孩子已经完成了工作并且已经准备好在另一个工作。有没有办法做到这一点?
条件变量的使用仅为半双工(从父对子),完全不建议使用信号。
你的建议是什么?
提前致谢。
答案 0 :(得分:1)
您通常可以通过pipe
来完成。父亲将“拥有”阅读方,孩子将推动写作方
父进程将通过select
等待通知。
答案 1 :(得分:1)
我认为你以其他方式解决问题,除非你不想实现类似Leader/Follower pattern的东西,其中线程轮流成为领导者。这在纸面上看起来很不错,但我发现由于所需的锁定量很少,这对于短暂的任务很有效。由于上下文切换,使用signalfd
或其他形式的等待也不是很好。总结一下,定义高效以提出正确的解决方案。
简单的线程池模式可以通过贪婪的消费者和没有孩子对父母的通知来消除。
parent:
task = wait_input()
lock_queue(q)
push_queue(q, task)
signal_workers()
unlock_queue(q)
worker:
while is_active:
lock_queue()
task = pop_queue(q)
unlock_queue()
do_task(task)
根据您的实现,signal_workers()
可以类似于pthread_cond_signal
来唤醒任何线程,队列锁定必须是阻止的。这样客户端将等待锁定或处理任务。
如果要终止它们,则应设置标志并进行广播。
您还可以使用读/写锁定并根据条件进行同步。
TL; DR,您应该使用锁定队列而不是按需分配父作业。
再次,您应该根据您的工作量使用锁定策略。在SLURM这样的事情上协调长时间运行的工作是一个非常不同的任务,其中父母通知是一个好主意,而线程池则不是。{/ p>