通知 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 通知是个好主意,而线程池则不是。