通知 Child 到 C 中的父线程
Notification Child to Father Thread in C
我正在使用线程池。所以我正在寻找一种简单有效的方法来通知父亲 child 已经完成了它的工作并且它已经准备好处理另一个。有办法吗?
仅half-duplex(从父亲到child(s))使用条件变量,完全不推荐使用信号。
你有什么建议?
提前致谢。
您通常可以通过 pipe
完成。爸爸会"own"会read-side,child会推write-side。
父进程将通过 select
.
等待通知
我认为你正在以相反的方式解决问题,除非你不想实现类似 Leader/Follower pattern 的东西,其中线程轮流担任领导者。这在纸面上看起来不错,但我发现由于所需的锁定量,它对于临时任务很少有效率。由于上下文切换,使用 signalfd
或其他形式的等待也不是很好。综上所述,定义高效以提出正确的解决方案。
简单的 thread-pool 模式可以摆脱贪婪的消费者而没有 child-to-parent 通知。
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
来唤醒 any 线程,队列锁定必须是阻塞的。这样,客户端将等待锁或处理任务。
如果你想终止它们,你应该设置一个标志,然后广播它们。
您还可以在条件上使用 read/write 锁和同步。
TL;DR,您应该使用锁定队列而不是 parent 分发作业 on-demand.
再一次,您应该根据您的工作量使用锁定策略。在 SLURM 之类的东西上协调 long-running 作业是一项非常不同的任务,其中 child-parent 通知是个好主意,而线程池则不是。
我正在使用线程池。所以我正在寻找一种简单有效的方法来通知父亲 child 已经完成了它的工作并且它已经准备好处理另一个。有办法吗?
仅half-duplex(从父亲到child(s))使用条件变量,完全不推荐使用信号。
你有什么建议?
提前致谢。
您通常可以通过 pipe
完成。爸爸会"own"会read-side,child会推write-side。
父进程将通过 select
.
我认为你正在以相反的方式解决问题,除非你不想实现类似 Leader/Follower pattern 的东西,其中线程轮流担任领导者。这在纸面上看起来不错,但我发现由于所需的锁定量,它对于临时任务很少有效率。由于上下文切换,使用 signalfd
或其他形式的等待也不是很好。综上所述,定义高效以提出正确的解决方案。
简单的 thread-pool 模式可以摆脱贪婪的消费者而没有 child-to-parent 通知。
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
来唤醒 any 线程,队列锁定必须是阻塞的。这样,客户端将等待锁或处理任务。
如果你想终止它们,你应该设置一个标志,然后广播它们。
您还可以在条件上使用 read/write 锁和同步。
TL;DR,您应该使用锁定队列而不是 parent 分发作业 on-demand.
再一次,您应该根据您的工作量使用锁定策略。在 SLURM 之类的东西上协调 long-running 作业是一项非常不同的任务,其中 child-parent 通知是个好主意,而线程池则不是。