【问题标题】:Notification Child to Father Thread in C在C中通知子线程到父线程
【发布时间】:2015-02-23 14:30:38
【问题描述】:

我正在使用线程池。所以我正在寻找一种简单有效的方法来通知父亲孩子已经完成了工作并且准备好为另一个孩子工作。有没有办法做到这一点?

条件变量的使用只是半双工的(从父亲到孩子),完全不推荐使用信号。

你有什么建议?

提前致谢。

【问题讨论】:

  • "条件变量的使用只是半双工" 那么为什么不我们另一个条件(每个孩子)使其成为“全双工”?
  • 孩子可以使用条件变量吗?我知道他们不能……
  • @TheNobleSix 为什么你需要全双工,如果你只想通知父母孩子已经完成(所以这是一种沟通方式)?
  • @TheNobleSix 你说的是子/父和线程池——你使用的是线程还是进程?

标签: c multithreading posix


【解决方案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 之类的东西上协调长时间运行的作业是一项非常不同的任务,其中子父通知是一个好主意,而线程池则不是。

【讨论】:

    【解决方案2】:

    您通常可以通过pipe 进行操作。父亲将“拥有”读取端,孩子将推动写入端。
    父进程将等待来自select的通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2011-02-27
      • 2014-03-12
      • 1970-01-01
      • 2017-11-11
      相关资源
      最近更新 更多