Qt Concurrent

Qt Concurrent 模块提供高级 API,使无需使用如互斥、读写锁、等待条件或信号量的低级线程原语,编写多线程程序成为可能。采用 Qt Concurrent 编写的程序,会根据可用处理器核心数自动调整所用线程数。这意味着,今天编写的应用程序可继续延伸,当将来部署在多核系统时。

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

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

STL 迭代器支持概述:

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

Random access iterators can be faster in cases where Qt Concurrent is iterating over a large number of lightweight items, since they allow skipping to any point in the container. In addition, using random access iterators allows Qt Concurrent to provide progress information through QFuture::progressValue () 和 QFutureWatcher::progressValueChanged ().

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

使用模块

使用 Qt 模块要求直接或透过其它依赖链接到模块库。一些构建工具为此有贡献支持,包括 CMake and qmake .

构建采用 CMake

使用 find_package() 命令去定位所需模块组件,在 Qt6 包:

find_package(Qt6 REQUIRED COMPONENTS Concurrent)
target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
					

另请参阅 构建采用 CMake 概述。

采用 qmake 构建

要配置采用 qmake 构建模块,添加模块作为值为 QT 变量在工程的 .pro 文件:

QT += concurrent
					

范例

模块演变

Qt Concurrent 的变化 列出了 Qt 的 Qt 6 系列在模块 API 和功能上所做出的重要改变。

许可

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