C++大师/工人模式

5
我正在寻找一个跨平台的 C++ 主从库或工作队列库。基本思路是,我的应用程序将创建某种任务或工作对象,将它们传递给工作主控或工作队列,然后在单独的线程或进程中执行这些工作。为了提供一些背景信息,该应用程序是一个 CD 拷贝器,我想并行化的任务包括“拷贝音轨”、“将 WAV 编码为 MP3”等。
我的基本要求如下:
- 必须支持可配置数量的并发任务。 - 必须支持任务之间的依赖关系,以便在所有依赖任务完成之前不执行任务。 - 必须允许取消任务(或至少不防止我将取消编码到自己的任务中)。 - 必须允许向主应用程序线程报告状态和进度信息。 - 必须在 Windows、Mac OS X 和 Linux 上工作。 - 必须是开源的。
如果这个库还能:
- 与 Qt 的信号/槽机制集成; - 支持使用线程或进程执行任务;
那就更好了。
类比 Java 的 ExecutorService 或其他类似的线程池库,我正在寻找一个类似的跨平台 C++ 库。有人知道这样的东西吗?
谢谢!

经过查看ACE和英特尔的线程构建块后,我决定TBB最符合我的要求。感谢所有抽出时间回复的人。 - Jason Voegele
6个回答

3
我已经有一段时间没有使用过它了,所以我不确定它是否完全符合您的需求,但请查看Adaptive Communications Environment (ACE)。这个库允许您构建“活动对象”,这些对象具有工作队列并在自己的线程中执行其主体,以及可以在对象之间共享的线程池。然后,您可以将队列工作对象传递给活动对象进行处理。对象可以以各种方式链接。该库相当庞大,并且有很多需要学习的内容,但已经有几本书写过它,并且在线上也有相当数量的教程信息可用。它应该能够做到您想要的一切,我的唯一担忧是它是否具有您正在寻找的接口“开箱即用”,或者您是否需要在其基础上构建才能得到确切的结果。

我确实记得很久以前看过ACE。当时我实际上是在看TAO CORBA实现,所以你知道那一定是很久以前的事了。;-)无论如何,ACE可能是一个选择,但我需要阅读它提供的API以确定它是否符合我的需求。谢谢。 - Jason Voegele
ACE 这些年来变得越来越好。我感觉他们可能没有尽可能地积极 - 在这方面,Boost 的人正在弥补一些空缺。但是当涉及操作系统抽象和事件分派时,ACE 是最好的选择。 - Chris K

2
我认为这需要使用英特尔的线程构建块,它几乎可以实现您想要的功能。

我假设英特尔的TBB库只能在英特尔架构上运行,对吗?这可能没问题,尽管我可能需要想出一些优雅降级方案来适应非英特尔平台。 - Jason Voegele

2

1

听起来你需要一种“时间共享系统”。

有一些不错的开源系统,但我不知道它们是否内置QT插槽支持。


“Time Sharing”这个术语在这里是不恰当的,因为它可以指任何能够进行多任务处理的操作系统。 - shoosh

0

这可能是你所需的远远超出范围,但仍然值得一提 -
BOINC 是一个分布式框架,可以用于此类任务。有一个主服务器分配任务执行,以及执行其命令的工作人员云。它是 SETI@Home 等项目背后的框架。


是的,我认为BOINC可能对我的应用程序来说有些过度了,因为它只是一个小型CD转换器。我编辑了原来的问题以表明这个应用程序是什么。不过还是谢谢你。 - Jason Voegele

0

查看此帖子以了解如何使用boost库在C++中创建线程:

C++中线程的简单示例

(尽管标题为c,但它是一个C++线程)

基本上,创建自己的“主”对象,该对象接受“可运行”对象并在新线程中启动它。

然后,您可以创建实现“可运行”接口的新类,并随时将它们传递给您的主运行程序。


谢谢,Zak,但我正在寻找的东西不是像手动管理线程那样低级。我已经使用Qt线程半写了自己的主/工作库,但我宁愿使用一些被证明过的东西,而不是创建自己的半成品解决方案。Qt线程和boost线程都提供并发执行,但它们实际上并不满足我在原始问题中提出的其他要求。 - Jason Voegele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接