小编Mar*_*tto的帖子

多线程作业队列管理器

我需要在交互式应用程序中管理CPU繁重的多任务作业.同样背景,我的具体应用是工程设计界面.当用户调整模型的不同参数和选项时,会在后台运行多个模拟,并在完成时显示结果,即使用户仍在编辑值时也是如此.由于多次模拟需要可变时间(有些是几毫秒,有些需要5秒,有些需要10分钟),所以基本上是尽可能快地显示反馈,但通常会中止以前开始但现在不再需要的作业,因为用户的更改已经使它们无效.不同的用户更改可能使不同的计算无效,因此在任何时候我可能有10个不同的模拟运行.

我非常有信心处理这种应用程序的代码级方法是某种多线程作业队列.这将包括提交作业以执行,设置任务优先级,等待作业完成,指定依赖项(执行此作业,但仅在作业X和作业Y完成后),取消符合某些条件的作业子集,查询内容的功能工作仍然存在,设置工作线程计数和优先级等等.多平台支持也非常有用.

这些不是软件中的新想法或愿望,但我处于应用程序的早期设计阶段,我需要选择用于管理此类任务的库.我过去在C中编写了我自己的粗线程管理器(我认为这是一个通过的仪式)但我想使用现代工具来开展我的工作,而不是我以前的hacks.

首先想到的是运行OpenMP,但我不确定这是我想要的.OpenMP非常适合在精细级别进行并行化,自动展开循环等.虽然是多平台,但它也会用#pragmas侵入您的代码.但主要是它不是为管理大型任务而设计的.尤其是取消挂起的作业或指定依赖项.可能,是的,但它并不优雅.

我注意到Google Chrome使用这样的作业管理器来完成最琐碎的任务.设计目标似乎是保持用户交互线程尽可能轻巧灵活,因此任何可以异步生成的东西都应该是.从查看Chrome源代码来看,这似乎不是一个通用库,但看看设计如何使用异步启动来保持交互速度仍然很有趣.这与我正在做的类似.

还有其他选择:

Surge.Act:用于定义作业的类似Boost的库.它建立在OpenMP之上,但允许链接依赖项,这很好.它似乎并不觉得它有一个可以查询的经理,取消工作等等.这是一个陈旧的项目所以依赖它是可怕的.

Job Queue非常接近我的想法,但它是一篇5年前的文章,而不是受支持的库.

Boost.threads确实有很好的平台独立同步,但那不是一个职业经理.POCO具有非常干净的任务启动设计,但同样不是链接任务的完整经理.(也许我低估了POCO).

因此,虽然有可用的选项,但我不满意,我觉得再次推出自己的库的冲动.但我宁愿使用已经存在的东西.即使在搜索之后(这里在SO和网上)我也没有发现任何感觉正确的东西,尽管我认为这必须是一种经常需要的工具,所以肯定有一些社区库或至少是常见的设计.在SO上有关于工作队列的一些帖子,但似乎没有任何东西适合.

我在这里的帖子是问你所有我错过的现有工具,和/或你如何推出自己的多线程作业队列.

c++ multithreading scheduled-tasks threadpool

32
推荐指数
2
解决办法
2万
查看次数

标签 统计

c++ ×1

multithreading ×1

scheduled-tasks ×1

threadpool ×1