【发布时间】:2012-03-23 18:07:24
【问题描述】:
我目前需要一个简单高效的线程池实现。我在这里和谷歌上搜索过,发现了许多有趣的链接,但到目前为止我发现的似乎都没有合适的。我在网上找到的大多数实现要么太复杂,要么缺少我需要的一些关键功能。
另外我不想使用我不理解的代码,所以我决定自己编写代码(有时重新发明轮子有助于我在知识和经验方面推动自己前进)。我当然了解线程池背后的基本思想,但一些实现细节对我来说还是有些不清楚。这可能是因为我需要的那种线程池有点特殊。让我描述一下。我有一项在特定(大)缓冲区上完成数十万次的任务。我已经测量过,如果我为这个任务使用线程,性能会好得多——缓冲区被分成子缓冲区,每个线程在子缓冲区上执行它的任务并返回结果。然后将所有线程的所有结果加在一起,给我最终的解决方案。
但是,由于经常这样做,我正在失去宝贵的时间,因为创建了这么多线程(因为线程创建带来的开销)。所以我想要一个线程池来执行这个任务,而不是每次都创建一组新的线程。
更清楚地说,这是我目前所拥有的:
- 将缓冲区分成N个大小相同的子缓冲区
- 为每个子缓冲区创建一个线程并在子缓冲区上运行它
- 等待所有线程完成 (WaitForMultipleObjects),将结果相加并销毁线程
- 重复
我想要实现的是:
- 将缓冲区分成N个大小相同的子缓冲区
- 将每个子缓冲区分配给线程池中的一个线程(恰好有 N 个线程)
- 一旦线程完成,让它休眠,直到另一个任务准备好
- 当所有线程都完成(并休眠)后,将它们产生的结果相加
- 通过唤醒线程并为其分配新任务来重复
如您所见,这是一个特殊的线程池,因为我需要等待线程完成。基本上我想摆脱创建线程的开销,因为程序经历了数十万次迭代,因此它可以在其生命周期内创建和销毁数百万个线程。好消息是我根本不需要线程之间的任何同步,它们都有自己的数据和存储位置来获得结果。但是我必须等到所有线程都完成并且我有最终的解决方案,因为下一个任务取决于上一个任务的结果。
我的主要问题是线程管理:
- 如何让我的线程“休眠”并在新任务准备好后唤醒它们?
- 如何等待所有线程完成?
如果有任何帮助,我将不胜感激。如果我不够清楚,也可以随时提问。谢谢!
【问题讨论】:
-
我看不出它有什么特别之处,阻塞线程完成是完全正常的。操作系统实现的线程池可以正常工作。使用 QueueUserWorkItem()、CreateEvent 和 SetEvent 进行同步。
-
@HansPassant:嗨,谢谢你的建议。您能否将其发布为包含更多详细信息的答案?你说的功能我不熟悉。
-
与 WaitForMultipleObjects() 相同的地方,使用 MSDN 库。
标签: c++ windows multithreading threadpool