Qt Concurrent

快速入门

QtConcurrent 名称空间提供高级 API,使之在不使用低级线程原语 (譬如:互斥、读写锁、等待条件或信号量) 编写多线程程序成为可能。编写程序采用 QtConcurrent 自动调节所用线程数,根据可用处理器核心数。这意味着,今天编写的应用程序今后部署在多核系统时,会继续缩放。

QtConcurrent 包括用于并行列表处理的函数式编程风格 API,包括用于共享内存 (非分布式) 系统的 MapReduce 和 FilterReduce 实现,及用于在 GUI 应用程序中管理异步计算的类:

Qt Concurrent 支持几种 STL 兼容容器和迭代器类型,但最适合处理拥有随机访问迭代器的 Qt 容器,例如 QList or QVector 。映射和过滤函数接受容器及开始/结束迭代器两者。

STL 迭代器支持概述:

迭代器类型 范例类 支持状态
输入迭代器 不支持
输出迭代器 不支持
转发迭代器 std::slist 支持
双向迭代器 QLinkedList , std::list 支持
随机访问迭代器 QList , QVector , std::vector 支持并推荐

当 Qt Concurrent 遍历大量轻量级项时,随机访问迭代器可以更快,由于它们允许跳到任何容器点。此外,使用随机访问迭代器允许 Qt Concurrent 提供进度信息,透过 QFuture::progressValue () 和 QFutureWatcher::progressValueChanged ().

非原位修改函数 (譬如 mapped() 和 filtered()) 会拷贝容器,当调用时。若使用的是 STL 容器,此拷贝操作可能需要一些时间,在这种情况下,我们推荐指定开始和结束迭代器为代替容器。

许可

Qt Concurrent 模块在商业许可下是可用的来自 Qt 公司 。此外,它在自由软件许可下也是可用的。从 Qt 5.4 起,这些自由软件许可是 GNU LGPL (次一般公共许可) 第 3 版 ,或 GNU GPL (一般公共许可) 第 2 版 。见 Qt 许可 进一步了解细节。