我正在使用线程池。所以我正在寻找一种简单而有效的方式来通知父亲,孩子已经完成了自己的工作,并且已经准备好开始工作。有没有办法做到这一点?C中的通知父子线程
条件变量的使用只是半双工(从父到孩子),并且完全不建议使用信号。
你的建议是什么?
在此先感谢。
我正在使用线程池。所以我正在寻找一种简单而有效的方式来通知父亲,孩子已经完成了自己的工作,并且已经准备好开始工作。有没有办法做到这一点?C中的通知父子线程
条件变量的使用只是半双工(从父到孩子),并且完全不建议使用信号。
你的建议是什么?
在此先感谢。
我认为你可以通过其他方式解决问题,除非你不想实施像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,其中父子通知是一个好主意,而线程池则不在此处。
“*条件变量的使用只是半双工*”那么为什么不让我们另一个条件(每个孩子)使其成为“全双工”呢? – alk 2015-02-23 14:41:26
孩子可以使用条件变量吗?我知道他们不能... – TheNobleSix 2015-02-23 14:45:11
我想你可以静态状态标志(例如,每个孩子一个位),哪些访问受到保护而不受竞争条件的影响。 – lucasg 2015-02-23 14:51:10