【问题标题】:Threads and queuing线程和队列
【发布时间】:2019-08-25 15:30:58
【问题描述】:

我想通过实现线程并行工作来加速排序功能。我对 pthread 的基本知识是创建、连接和使用互斥锁来防止死锁。

所以我的问题是: 完成任务后如何将任务分配给线程?例如,如果我将列表的一半给线程 1 排序,另一个给任务 2 排序,一旦任务 1 完成,它应该跳转到任务 2 并帮助它。

如果有帮助,我正在使用快速排序进行测试。

我尝试查看是否有任务分配功能,但我偶然发现的功能不同。

【问题讨论】:

  • “跳到任务二并帮助它”是什么意思?通常,你不会。你在做的时候把任务分成不同的线程,让线程完成,然后合并结果。
  • @MFisherKDX:有时会使用持久线程池,线程被动态分配任务,而不是重复创建和销毁。
  • @MFisherKDX 这也是我的假设,但我的某人建议在线程(在线程池中)完成其任务后,可以“打开”新任务或从另一个执行任务的线程中拆分并对该拆分进行排序。不确定这是否有意义

标签: c pthreads


【解决方案1】:

没有什么特别复杂的。

首先,您需要一个可等待队列。也就是说,按顺序维护的事物列表,如果队列为空,则允许线程等待。

其次,您需要编写从等待队列中弹出作业的代码,如果队列中没有作业则等待。然后它就完成了这项工作。

这是我写的一些example code。它是用 C++ 编写的,但是从代码中可以看出总体思路。

【讨论】:

  • 嗨,大卫。不错的线程池实现。但我不明白这如何回答 OP 的问题。他问,在给数组的每个一半分配两个线程进行排序之后,如何获取首先完成的线程,然后使用它来“帮助仍在运行的线程”完成排序。这是一个要尝试回答的复杂得多的问题。
  • 这没有多大帮助。在您的代码中,您有 jobs_.emplace (std::move (func));但是当我查看 pthread 手册页时,我找不到与 emplace 函数等效的 C 语言。
  • @user10416282 emplace 是对std:vectorstd::queue 等容器的操作。这不是线程特定的操作。
  • @user10416282 就像“将作业移到队列中”一样。你可以随心所欲地实现它。
  • @MFisherKDX 这就是他想做的事情,但阻止他这样做的具体问题是他没有这个问题的答案:“我如何分配任务完成任务后转到线程?”这就是我的回答。